Проблемы с чтением/записью php://temp stream
У меня возникают проблемы с чтением и записью потока php://temp
в PHP 5.3.2
У меня в основном есть:
file_put_contents('php://temp/test', 'test');
var_dump(file_get_contents('php://temp/test'));
Единственный вывод, который я получаю, это string(0) ""
Должен ли я вернуть свой "тест"?
Ответы
Ответ 1
php://temp
не является файловым путем, это псевдопротокол, который всегда создает новый случайный временный файл при его использовании. /test
фактически игнорируется полностью. Единственными дополнительными "аргументами", которые принимает обертка php://temp
, является /maxmemory:n
. Вам нужно оставить дескриптор файла открытым всплывающим потоком, иначе он будет отброшен:
$tmp = fopen('php://temp', 'r+');
fwrite($tmp, 'test');
rewind($tmp);
fpassthru($tmp);
fclose($tmp);
См. http://php.net/manual/en/wrappers.php.php#refsect1-wrappers.php-examples
Ответ 2
Каждый раз, когда вы используете fopen для получения обработчика, содержимое php://temp будет очищено. Используйте rewind() и stream_get_contents() для получения контента. Или, используйте обычные cachers, такие как APC или memcache:)
Ответ 3
Я знаю, что уже поздно, но в дополнение к ответу @OZ_ я только что обнаружил, что 'fread' тоже работает после перемотки.
$handle = fopen('php://temp', 'w+');
fwrite($handle, 'I am freaking awesome');
fread($handle); // returns '';
rewind($handle); // resets the position of pointer
fread($handle, fstat($handle)['size']); // I am freaking awesome
Ответ 4
Наконец-то нашел документально подтвержденную небольшую заметку, объясняющую почему
Пример 5 в Руководстве по PHP использовал почти тот же пример кода и говорит:
php://memory и php://temp не могут использоваться повторно, то есть после закрытия потоков невозможно снова обратиться к ним.
file_put_contents('php://memory', 'PHP');
echo file_get_contents('php://memory'); // prints nothing
Я предполагаю, что это означает, что file_put_contents()
закрывает поток внутренне, что делает file_get_contents()
неспособным восстановить данные в потоке снова