我正在开发一个流包装器类来在项目中实现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(在流方面)是否存在根本差异。有没有更好的方法来检测这些类型的流是否可写?