как снова перемотать () файл http-потока в PHP, кроме fclose () и fopen ()?

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


person Petruza    schedule 13.02.2011    source источник


Ответы (3)


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

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

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

person KingCrunch    schedule 29.06.2011
comment
Спасибо! Следует отметить, что $cache будет в конце потока после вызова stream_copy_to_stream, поэтому вам может понадобиться rewind в зависимости от того, что вы делаете дальше. - person rodnaph; 24.02.2017

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

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

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

person coreyward    schedule 13.02.2011
comment
Я не знаю, может быть, не seek(), но rewind() можно было бы реализовать, сделав еще один вызов для открытия потока, что более или менее то, что делает fclose();fopen(), так что в любом случае это не имеет особого смысла. - person Petruza; 13.02.2011
comment
Повторное открытие сокета на самом деле просто закрытие сокета и открытие нового. Он не сбрасывает указатель на уже открытый сокет. Новый сокет = новый HTTP-запрос. - person coreyward; 13.02.2011

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

Примечание.

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

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

person Mark Baker    schedule 13.02.2011
comment
Да, это то, что я сказал по вопросу. - person Petruza; 13.02.2011