php: // memory & php: // temp;сохранение потоковых данных при последующем создании дескриптора - PullRequest
1 голос
/ 02 августа 2011

Этот вопрос тесно связан с моими новыми находками, касающимися этого вопроса .

Есть ли способ сохранить данные в потоке php://memory или php://temp между дескрипторами?Я прочитал ( где-то, что я не могу получить источник от руки ), что последующие открытия вышеупомянутых потоков очищают существующие данные.

$mem1 = fopen('php://memory', 'r+');
fwrite($mem1, 'hello world');
rewind($mem1);
fpassthru($mem1); // "hello world"

$mem2 = fopen('php://memory', 'r+');
rewind($mem2);
fpassthru($mem2); // empty

Итак, опять мой вопрос, есть ли способ заставить существующийданные для сохранения в потоке при создании нового дескриптора для него?

( Последний вызов fpassthru(), конечно, сбросит hello world, если это возможно )

Ответы [ 3 ]

6 голосов
/ 02 августа 2011

Открытие одного из псевдопотоков php://temp или php://memory всегда открывает новый поток, что означает, что каждый ваш поток, открытый таким образом, уникален. Таким образом, вы не можете прочитать содержимое ранее записанного потока в другой один.

0 голосов
/ 24 сентября 2015

Обработчики уникальны, поэтому вам придется передать обработчик или (не дай бог) оставить обработчик глобальным

$GLOBALS['my_global_memory_stream']=fopen('php://memory','r+');

0 голосов
/ 23 октября 2013

Если вам нужен виртуальный поток в памяти, в котором хранятся данные, вы можете использовать https://github.com/mikey179/vfsStream - хотя он в основном используется для тестирования операций ввода-вывода, он должен отвечать вашим требованиям - он хранит данные во внутренних объектах, которые идентифицируются виртуальные URL, чтобы вы могли получить доступ к тем же данным в памяти, используя тот же URL.

...