Как перемотать () файл потока HTTP в PHP, кроме fclose () и fopen () снова? - PullRequest
1 голос
/ 13 февраля 2011

PHP fopen позволяет вам fopen() http местоположений в виде потоков файлов.
Но вы не можете fseek() или rewind() их, есть ли способ сделать это, кроме fclose() и fopen() это снова?

Ответы [ 3 ]

4 голосов
/ 29 июня 2011

Другие упоминали об этом: PHP не поддерживает fseek() и rewind() в нелокальных потоках. Я предлагаю вам скачать / кэшировать файл и взаимодействовать с ним. Например

$cache = fopen('php://temp', 'r+');
stream_copy_to_stream($remoteResource, $cache);

Теперь вы должны иметь возможность делать с $cache все, что вы делали с $remoteResource раньше, за исключением того, что теперь вы можете искать внутри (и, следовательно, также перематывать) его. Если вы закроете временный поток, PHP автоматически очистит все используемые ресурсы.

1 голос
/ 13 февраля 2011

Для начала вам не следует использовать функции f____ для открытия удаленных файлов.Вот для чего нужен curl.

Я не верю, что существует способ сброса / перемотки указателя на удаленном сокете, поэтому, если файловые функции PHP не буферизируют и не кэшируют данные в потоке, я неЯ не понимаю, как они могли бы позволить вам перематывать указатель.

Я могу ошибаться, хотя ... Я не эксперт по сокетам.

0 голосов
/ 13 февраля 2011

Цитирование из PHP документов

Примечание:

Не все потоки поддерживают поиск. Для тех, кто не поддерживает поиск, поиск вперед с текущей позиции осуществляется путем чтения и отбрасывание данных; другие формы поиска потерпят неудачу

Как и в случае с fseek (), функция rewind () не может использоваться для файловых указателей, возвращаемых fopen (), если они используют форматы "http://" или" ftp: // ".

...