【问题标题】:Is there a guaranteed file resource on PHP?PHP 上是否有保证的文件资源?
【发布时间】:2018-08-31 13:08:09
【问题描述】:

是否有一些fopen 将在大多数 PHP 安装中成功打开的 url/流? /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 中,上述函数应保证资源并避免布尔值。我知道resources are not official types,但仍然希望尽可能地保证类型安全。

【问题讨论】:

  • php://temp 应该可以正常工作,但可能不是实际记录事物的最佳位置,因为它被设计为瞬态的。它实际上根本不会触及文件系统,除非您写入超过定义的内存限制(默认为 2mb),因此脚本一退出它就会丢失。 tmpfile 可能是另一种选择。
  • 看看sys_get_temp_dir,它应该适用于几乎所有运行 PHP 的操作系统:secure.php.net/manual/en/function.sys-get-temp-dir.php
  • 如果记录错误是这里的目的,那么为什么不使用php.net/manual/en/function.error-log.php 开始呢?使用 message_type=0 时,这已经采用本地设置来考虑应该记录哪里错误。
  • Do some error logging here 评论只是为了表明我想要一些打开文件失败的信号。我将编辑示例。

标签: php stream disaster-recovery


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    如果您需要一个流来写入错误,为什么不写信给php://stderr

    文档中的示例:

    在 windows 上登录到 apache 时,error_log 和 trigger_error 导致前面的 apache 状态为 error 信息。如果您只想记录信息,这很糟糕。然而 你可以简单地登录到 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() 函数。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-26
      • 2020-08-28
      • 1970-01-01
      • 2018-01-27
      • 1970-01-01
      • 2020-09-05
      • 2015-04-05
      • 1970-01-01
      相关资源
      最近更新 更多