Подтвердить что ты не робот

Проблемы с чтением/записью 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) ""

Должен ли я вернуть свой "тест"?

4b9b3361

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