Возникли проблемы при чтении / записи потока php: // temp - PullRequest
22 голосов
/ 10 мая 2011

У меня проблемы с чтением и записью потока php://temp в PHP 5.3.2

У меня в основном есть:

file_put_contents('php://temp/test', 'test');
var_dump(file_get_contents('php://temp/test'));

Единственный вывод, который я получаю - string(0) ""

Разве мне не вернуть мой «тест»?

Ответы [ 4 ]

21 голосов
/ 10 мая 2011

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

9 голосов
/ 10 мая 2011

Каждый раз, когда вы используете fopen для получения обработчика, содержимое php: // temp будет сбрасываться.Используйте rewind () и stream_get_contents () для получения контента.Или используйте обычные кэши, такие как APC или memcache:)

0 голосов
/ 05 февраля 2019

Наконец-то нашли небольшую документальную записку, объясняющую, почему

Пример 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() неспособным восстановить данные в потоке снова

0 голосов
/ 24 октября 2018

Я знаю, что уже поздно, но в дополнение к ответу @ 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...