是否有一些url / stream,fopen
将在大多数PHP安装中成功打开? /dev/null
在某些系统上不可用或不可打开。像php://temp
这样的东西应该是一个相当安全的赌注,对吧?
这个代码的应用程序保证文件资源,而不是bool|resource
的fopen
混合文件类型:
/**
* @return resource
*/
function openFileWithResourceGuarantee() {
$fh = @fopen('/write/protected/location.txt', 'w');
if ( $fh === false ) {
error_log('Could not open /write/protected/location.txt');
$fh = fopen('php://temp');
}
return $fh;
}
在具有严格类型的PHP 7中,上述函数应该保证资源并避免bool。我知道resources are not official types,但仍然希望尽可能保持类型安全。
php://memory
应该是普遍可用的。
如果你需要一个写错误的流你为什么不写php://stderr
?
来自文档的示例:
在Windows上登录到apache时,error_log和trigger_error都会在消息前面导致apache状态错误。如果您只想做日志信息,这很糟糕。但是,您只需登录到stderr,但是您必须执行所有消息组装:
LogToApache($Message) { $stderr = fopen('php://stderr', 'w'); fwrite($stderr,$Message); fclose($stderr); }
注意:php://stderr
有时与php://stdout
相同,但并非总是如此。
对于溪流,请参阅:http://php.net/manual/en/wrappers.php.php
像
php://temp
这样的东西应该是一个相当安全的赌注,对吧?
正如@weirdan已经指出的那样php://memory
可能更安全,因为它甚至不需要创建任何文件。内存访问必须是可能的。来自文档:
php://memory
和php://temp
是读写流,允许临时数据存储在类似文件的包装器中。两者之间的唯一区别是php://memory
将始终将其数据存储在内存中,而一旦存储的数据量达到预定义的限制(默认值为2 MB),php://temp
将使用临时文件。此临时文件的位置以与sys_get_temp_dir()
函数相同的方式确定。
不确定这是否完全回答了你的问题,但它是否会引导你走向正确的方向?