【问题标题】:PHP - is_readable() returns incorrect valuePHP - is_readable() 返回不正确的值
【发布时间】:2012-12-02 14:11:34
【问题描述】:

我正在使用这样的脚本:

$path = dirname(__FILE__)."/folder/file.ext"
if(is_readable($path)){
     $file = fread(fopen($path,"r"), filesize($path));
}else{
     //do something else if file can't be opened
}

令人惊讶的是它会产生以下错误:

Warning: fread() [function.fread]: Length parameter must be greater than 0
in /nfs/c10/h02/mnt/161920/domains/example.com/html/my-folder/file.php on line 16

我想知道为什么会这样。它仅在某些服务器上发生,而在其他服务器上则很好。成功使用fread 需要什么条件?文件存在于该位置。

【问题讨论】:

  • 查找 file_get_contents() 而不是在阅读后不关闭文件的 hack。
  • 您的filesize($path) 值为 0 或小于零,通过打印检查该值。

标签: php file fopen fread


【解决方案1】:

正如大家所说,filesize大概是0。

按照建议使用file_get_contents,或者如果您绝对想要/需要使用fread(),您可以在php 5.3+ 上通过以下方式解决它:

$path = dirname(__FILE__)."/folder/file.ext"
if(is_readable($path)){
    $file = fread(fopen($path,"r"), filesize($path) ?: 1);
}else{
    //do something else if file can't be opened
}

注意到?: 1了吗?它被称为ternary operator。也就是说,如果文件大小评估为真(即大于 0),则使用文件大小或使用 1。

绝对不是最佳实践,但指出来很有趣。

【讨论】:

  • 太棒了 :) 非常感谢!现在我知道它发生了什么,并感谢您提供的 ?: 技巧。
  • 阅读PHP ternary operators,这是一个很棒的功能!
  • 是的,我知道 - 我经常使用它,但我会选择 file_get_contents,因为 ?: 1 看起来像是一些不安全的作弊((1)如果给文件 1 字节是否安全它是 0?它可能会导致进一步的问题 (2) 为什么它有 0?我的文件都没有 0 - 除非它也尝试加载一些隐藏文件,因为我正在做 scandir 并且我只排除 ...,(3)即使文件是空的——它不应该总是有一些大小吗?)。
  • 我同意;我会使用语义明确的方法。不过要回答你的问题:(1)是的,我相信是的,fread 只是想知道要读多少,(2)不知道,但(3)它不是无效的:en.wikipedia.org/wiki/Zero_byte_file
  • 那么也许有些服务器包含“零字节”文件,而有些则没有。我将很快在客户端服务器上使用file_get_contents 对其进行测试,它可能会正常工作:) 非常感谢您的回答!我将此标记为已接受的答案,因为它包含更多信息,但此问题的两个答案都是正确的。
【解决方案2】:

如果文件为空,则可以读取。但是你不能用fread读取0字节。

空文件 == 文件大小为 0。

对于您的用例,您还可以使用 PHP 的 file_get_contents 函数。

【讨论】:

  • 太棒了 :) 非常感谢!现在我知道它发生了什么。
猜你喜欢
  • 2012-12-22
  • 1970-01-01
  • 1970-01-01
  • 2014-04-24
  • 2012-06-18
  • 1970-01-01
  • 2017-07-29
  • 2016-10-09
  • 2021-10-26
相关资源
最近更新 更多