【问题标题】:Having problems reading/writing the php://temp stream读取/写入 php://temp 流时出现问题
【发布时间】:2011-08-22 05:41:30
【问题描述】:

我在 PHP 5.3.2 中读取和写入 php://temp 流时遇到问题

我基本上有:

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

我得到的唯一输出是string(0) ""

我不应该拿回我的“测试”吗?

【问题讨论】:

    标签: php stream


    【解决方案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

    【讨论】:

    • 找到我需要的 - 使用 vfsStream
    • 为什么manual 声明file_put_contents() 可以像fopen() 一样接受url 包装器
    • @Accountantم ...‽ ?‍♂️ 它可以完全没问题。只是这个特定的包装器以非常特定的方式运行。还有其他的可以很好地使用它。手册并没有说 每个 包装器都可以与 file_put_contents 一起使用。
    • @deceze '只是这个特殊的包装器以一种非常特殊的方式运行' 是的,我终于在手册中找到了一个note,它使用了完全相同的代码示例问题并解释说php://tempphp://memory 不可重复使用。我猜他们的意思是一旦file_put_contents() 在内部关闭流,我就无法通过file_get_contents() 再次获得它。
    【解决方案2】:

    每次使用 fopen 获取处理程序时,都会刷新 php://temp 的内容。使用 rewind() 和 stream_get_contents() 来获取内容。或者,使用普通的缓存器,例如 APC 或 memcache :)

    【讨论】:

    • 附带说明,您可以将rewind 隐含地使用stream_get_contents($stream, -1, 0)。这将从头开始读取整个流。
    【解决方案3】:

    终于找到了一个记录在案的小笔记,解释了原因

    Example 5 at the PHP Manual 使用了几乎与您完全相同的代码示例并说

    php://memory 和 php://temp 不可重用,即在流之后 已关闭,无法再次引用它们。

    file_put_contents('php://memory', 'PHP');
    echo file_get_contents('php://memory'); // prints nothing
    

    我猜这意味着file_put_contents()在内部关闭了流,这使得file_get_contents()无法再次恢复流中的数据

    【讨论】:

      【解决方案4】:

      我知道这已经晚了,但除了@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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-05-24
        • 2011-10-12
        • 2013-10-18
        • 2011-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多