Я экспериментирую с некоторыми функциями 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.
Это ответ на проблему, и я надеюсь, что многие выиграют от этого:
При использовании 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);
Других решений пока нет …