如何摆脱 PHP 中的 filesize() 警告?
Posted
技术标签:
【中文标题】如何摆脱 PHP 中的 filesize() 警告?【英文标题】:How can I get rid of a filesize() warning in PHP? 【发布时间】:2011-06-17 16:21:24 【问题描述】:除了关闭警告.. 我可以在我的代码中做些什么来摆脱这个错误:
warning: filesize() [function.filesize] stat failed for .... on line 152
代码是:
$store_filesize = filesize($file->filepath);
【问题讨论】:
什么是$file->filepath
?
null 有时是文件路径
如果是null
那你就会收到警告。
可以加if($file->filepath != null)
【参考方案1】:
我不确定这是否是您想要的(例如,我不清楚您是否想弄清楚它发生的原因并解决它)但如果您只是想抑制错误,您通常可以使用 @ in函数名的前面。
例如
$store_filesize = @filesize($file->filepath);
【讨论】:
这会抑制错误,但不会解决根本问题。不好的做法。 我认为在我的回答中解决了这个问题,OP 没有说明原因。这并不总是不好的做法,这实际上取决于这样做是否合适。我不认为使用 is_readable() 检查是抑制所有错误的合适方法。 这总是不好的做法。有一些语言结构可以更优雅地处理错误,包括try...catch
和set_error_handler
。 php 在执行被抑制的语句之前动态地将error_reporting
更改为 0,然后将其更改回来,即使没有错误也是如此。为什么要花时间来获得更少的代码失败信息?为什么要支付处理器时间来抑制不存在的错误?良好的实践要求您编写实际处理或防止错误所需的琐碎代码,而不是简单地忽略它们。应该从不在 PHP 中使用 @
。永远。
@Chris 并非所有失败都会引发异常,也并非所有失败都会产生后果,有时它只是一个不错的选择。包装 try/catch 没有任何内容不是更好的编译指示(而且不是免费的 - 如果服务经常失败,那就更糟了)。
注:我一般不鼓励人们使用@ - 并且我自己例外地很少使用它 - 但一切都取决于上下文。鼓励人们编写空的 try/catch 块也会产生后果(我认为更糟)。【参考方案2】:
$store_filesize = @filesize($file->filepath);
if ($store_filesize === FALSE)
throw new \Exception('filesize failed');
【讨论】:
【参考方案3】:除非文件确实存在,否则不要调用filesize
:
$store_filesize = is_file($file->filepath) ? filesize($file->filepath) : 0;
is_file
的文档:http://php.net/manual/en/function.is-file.php
:)
【讨论】:
如果您有包含目录的权限,您可以致电filesize
。 is_readable
检查文件本身的权限,因此您返回 0 尽管在某些情况下您可以获得更多信息。此外,这引入了竞争条件 - 如果文件在 filesize
之前被删除,函数仍然会失败。
filesize
不会抛出异常,对吗?因此,您的代码更改无效。另外,如果包装在 try..catch 中可以工作,那么您不能跳过is_file
检查吗?【参考方案4】:
记得查看null
:
if($file->filepath != null)
$store_filesize = filesize($file->filepath);
【讨论】:
【参考方案5】:检查文件是否存在,是否是文件,是否可读
if (is_readable($file->filepath))
$store_filesize = filesize($file->filepath);
【讨论】:
这会受到竞争条件的影响,在is_readable
调用后文件被删除。而且,你可以有权限获取文件大小,但不能读取文件,所以这段代码任意获取一些文件的文件大小。以上是关于如何摆脱 PHP 中的 filesize() 警告?的主要内容,如果未能解决你的问题,请参考以下文章
如何摆脱 React 中的 import/no-anonymous-default-export 警告?