PHP上是否有保证的文件资源?

时间:2018-08-31 13:08:09

标签: php stream disaster-recovery

在大多数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,但仍然希望尽可能地保持类型安全。

2 个答案:

答案 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://memoryphp://temp是读写流,它们允许   临时数据要存储在类似文件的包装中。唯一的   两者的区别在于php://memory将始终存储其   数据存储在内存中,而php://temp将在   存储的数据量达到预定义的限制(默认为2 MB)。   此临时文件的位置与确定方法相同   sys_get_temp_dir()函数。

不确定这是否能完全回答您的问题,但是会引导您朝正确的方向前进吗?