2016-09-22 6 views
1

Я экспериментирую с некоторыми функциями php file/stream. И у меня проблемы со страхами.php сначала fseek в потоке, а потом?

Эти данные отправить скрипт:

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 на машине для окон.

+0

Просто интересно, почему не '$ _POST' или' parse_str() '? – AbraCadaver

+0

Я собираюсь сам реализовать интерфейс php-fig psr-7. Это как часть обучения созданию современной php-структуры. – ITGuy1990

+0

Вы уверены, что все данные, передаваемые на php, не добавляют данные в начало? Что происходит, когда вы используете другое смещение в 'fseek()'? –

ответ

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); 

 Смежные вопросы

  • Нет связанных вопросов^_^