PHP上有保证的文件资源吗?

问题描述 投票:2回答:2

是否有一些url / stream,fopen将在大多数PHP安装中成功打开? /dev/null在某些系统上不可用或不可打开。像php://temp这样的东西应该是一个相当安全的赌注,对吧?

这个代码的应用程序保证文件资源,而不是bool|resourcefopen混合文件类型:

/**
 * @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 stream disaster-recovery
2个回答
1
投票

php://memory应该是普遍可用的。


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将始终将其数据存储在内存中,而一旦存储的数据量达到预定义的限制(默认值为2 MB),php://temp将使用临时文件。此临时文件的位置以与sys_get_temp_dir()函数相同的方式确定。

不确定这是否完全回答了你的问题,但它是否会引导你走向正确的方向?

© www.soinside.com 2019 - 2024. All rights reserved.