1

这个问题与我关于这个问题的新发现密切相关。

有什么方法可以保留句柄php://memoryphp://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

4

3 回答 3

6

打开一个伪流php://tempphp://memory总是打开一个新流,这意味着您以这种方式打开的每个流都是独一无二的。因此,您无法读取之前写入另一个流的内容。

于 2011-08-02T19:18:36.147 回答
0

如果您需要保留数据的内存虚拟流,您可以使用https://github.com/mikey179/vfsStream - 虽然它主要用于测试 I/O 操作,但它应该满足您的要求 - 它将数据存储在内部对象中,这些对象是由虚拟 URL 标识,因此您可以通过访问相同的 URL 来访问内存中的相同数据。

于 2013-10-23T12:42:35.173 回答
0

处理程序是唯一的,因此您必须传递处理程序,或者(上帝禁止)保持处理程序全局

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

于 2015-09-24T15:08:00.477 回答