PHP fopen позволяет вам fopen()
размещать http в виде файловых потоков.
Но вы не можете fseek()
или rewind()
их, есть ли другой способ сделать это, кроме fclose()
и fopen()
еще раз?
как снова перемотать () файл http-потока в PHP, кроме fclose () и fopen ()?
Ответы (3)
Другие упомянули об этом: PHP не поддерживает fseek()
и rewind()
в нелокальных потоках. Я предлагаю вам загрузить/кэшировать файл и взаимодействовать с ним. Например
$cache = fopen('php://temp', 'r+');
stream_copy_to_stream($remoteResource, $cache);
Теперь вы должны быть в состоянии делать с $cache
все, что вы делали с $remoteResource
раньше, за исключением того, что теперь вы можете искать внутри (и, следовательно, также перематывать) его. Если вы закроете временный поток, PHP автоматически очистит все используемые ресурсы.
$cache
будет в конце потока после вызова stream_copy_to_stream
, поэтому вам может понадобиться rewind
в зависимости от того, что вы делаете дальше.
- person rodnaph; 24.02.2017
Во-первых, вы не должны использовать функции f____
для открытия удаленных файлов. Вот для чего нужен керлинг.
Я не верю, что есть способ сбросить/перемотать указатель в удаленном сокете, поэтому, если файловые функции PHP не буферизируют и не кэшируют данные в потоке, я не понимаю, как они могут позволить вам перемотать указатель.
Хотя могу ошибаться... Я не эксперт по сокетам.
seek()
, но rewind()
можно было бы реализовать, сделав еще один вызов для открытия потока, что более или менее то, что делает fclose();fopen(), так что в любом случае это не имеет особого смысла.
- person Petruza; 13.02.2011
Цитата из документов PHP
Примечание.
Не все потоки поддерживают поиск. Для тех, кто не поддерживает поиск, поиск вперед из текущей позиции выполняется путем чтения и отбрасывания данных; другие формы поиска потерпят неудачу
Как и в случае с fseek(), функцию rewind() нельзя использовать для файловых указателей, возвращаемых функцией fopen(), если они используют форматы "http://" или "ftp://".