position — php сначала fseek в потоке, затем fread?

Я экспериментирую с некоторыми функциями php файла / потока. И у меня проблемы с фредом.

Эти данные отправляются в скрипт php:

    baz=bomb&foo=bar&baz=bomb&foo=bar&foo=bar&baz=bomb

И этот скрипт запускает этот код:

    <php
$fp = fopen("php://input", "rb");
fseek($fp, 3, SEEK_SET);
echo "<br>ftell: ".ftell($fp)."<br>";
echo "<br>fread(resource, 4): ".fread($fp, 4)."<br>";
fclose($fp);

Вывод показывает:

    ftell: 3
fread(resource, 4): baz=

То, что я ожидаю, что это показывает:

    =bom

Почему кажется, что fread сначала устанавливает указатель на начало потока, а затем читает? Какой смысл искать через поток и не иметь возможности читать с определенной позиции?

Я использую версию php:
7.0.8 на машине windows.

1

Решение

Это ответ на проблему, и я надеюсь, что многие выиграют от этого:

При использовании fseek ftell, кажется, сообщает вам, где находится указатель в потоке. Но это не так. Указатель в потоке не может быть перемещен функцией fseek достаточно странно. Это, как указал Старсон Хохшильд, потому что основной поток не реализует обработчик поиска.

Поэтому альтернативой может быть чтение $ _POST. Но как насчет большого контента?

Существует поток с именем php: // temp. Первые два МБ, которые вы вставите в него, войдут в оперативную память вашего компьютера. Больше данных попадет во временный файл на вашем компьютере.

Таким образом, вы можете использовать что-то вроде этого:

    $tempStream = fopen("php://input", "rb");
$stream = fopen("php://temp", "w+b");
$size = 0;
while (!feof($in)) $size += fwrite($stream,fread($tempStream,8192)); //Copy the php://input stream to the seekable php://temp stream. $size will contain the size in bytes of the $stream resource.
fclose($tempStream);

//Do your next fread's, fseek's, ftell's etc here on the $stream resource.

fclose($stream);
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]