在大多数PHP安装中是否有fopen
将成功打开的url /流? /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中,以上函数应保证资源,避免出现麻烦。我知道resources are not official types,但仍然希望尽可能地保持类型安全。
答案 0 :(得分:1)
php://memory
应该是通用的。
答案 1 :(得分:0)
如果您需要写错误的信息流来说明为什么不写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
将始终存储其 数据存储在内存中,而php://temp
将在 存储的数据量达到预定义的限制(默认为2 MB)。 此临时文件的位置与确定方法相同sys_get_temp_dir()
函数。
不确定这是否能完全回答您的问题,但是会引导您朝正确的方向前进吗?