检查是否可以使用is_writable()写入php:// memory

时间:2015-08-28 18:45:28

标签: php stream

我正在开发一个流包装器类来在项目中实现PSR-7

在一个特定的流使用中,我发现is_writable()没有为可以写入的内置PHP流返回正确的结果,例如:php://memory

示例:

$handle = fopen('php://memory', 'w');
var_dump(is_writable(stream_get_meta_data($handle)['uri']));  //returns false
var_dump(fwrite($handle, 'foo'));  //int (3)
rewind($handle);
echo stream_get_contents($handle);  //prints 'foo'

我不确定这是预期还是错误行为。在写入模式下打开流,可以写入内容,但is_writable()无论如何都会返回false。

我不相信应该返回false,因为php://memory是一个读写流per the docs。如果我换掉文件的PHP流,我会得到预期的结果。

$handle = fopen('foo.txt', 'w');
var_dump(is_writable(stream_get_meta_data($handle)['uri']));  //returns true
var_dump(fwrite($handle, 'foo'));  //int (3)
rewind($handle);
echo stream_get_contents($handle);  //prints 'foo'

为了解决这个问题,我编写了一个函数来查看流的mode元数据。

function isWritable($stream)
{
    if (!is_resource($stream) || get_resource_type($stream) !== 'stream')
    {
        //I only want this to work on stream resources.
        return false;
    }

    return (preg_match('/[w+]/', stream_get_meta_data($stream)['mode']) === 1)
        ? true
        : false;
}

我的问题:为什么is_writable()对于可以写入的流返回false?在使用fopen()打开的文件和内置流之间,PHP(在流方面)是否存在根本差异。有没有更好的方法来检测这些类型的流是否可写?

0 个答案:

没有答案