如何在PHP中消除filesize()警告?

4

除了关闭警告之外,我在我的代码中还能做什么来消除这个错误:

warning: filesize() [function.filesize] stat failed for ....  on line 152

代码如下:
$store_filesize = filesize($file->filepath);

$file->filepath 是什么? - Naftali
有时候是 null,但其他时候它是文件路径。 - Shamoon
如果它是“null”,那么你将会收到警告。 - Naftali
您可以添加 if($file->filepath != null) - kskaradzinski
5个回答

6
我不确定这是否是您想要的(例如,我不清楚您是否想找出为什么会发生这种情况并解决它),但如果您只是想抑制错误,通常可以在函数名前面使用@。
例如:
$store_filesize = @filesize($file->filepath);

9
这样做可以抑制错误,但并未解决潜在的问题。这是不良的做法。 - Chris Baker
2
我认为我在我的回答中已经解决了这个问题,但是OP没有说明原因。这并不总是不好的做法,这取决于是否适当。然而,我不会假设使用is_readable()来抑制所有错误是一个合适的方法。 - Iain Collins
1
这总是不好的做法。有语言结构可以更优雅地处理错误,包括 try...catchset_error_handler。PHP 在执行被抑制的语句之前动态更改 error_reporting 为 0,然后再将其更改回来,即使没有错误也是如此。为什么要花费处理时间来获取有关代码故障的更少信息?为什么要花费处理器时间来抑制不存在的错误?良好的实践规定您编写必要的微不足道的代码来实际处理或防止错误,而不仅仅是忽略它们。在 PHP 中,永远不要使用 @ - Chris Baker
3
并不是所有失败都会抛出异常,也不是每个失败都有实质上的后果,有时候只是一个额外的需求。在try/catch语句中不加任何东西并不能更好地优化代码(而且不是免费的,如果服务经常失败则更糟糕)。 - Iain Collins
1
注意:我并不鼓励人们经常使用 @ 符号,而且我自己也极少使用它,但一切都取决于上下文。鼓励人们编写空的 try/catch 块也会产生后果(我认为更糟糕)。 - Iain Collins

3

1
如果您拥有包含目录的权限,可以调用 filesizeis_readable 检查文件本身的权限,因此在某些情况下,您可能会返回 0 而无法获取更多信息。此外,这会引入竞态条件 - 如果文件在 filesize 之前被删除,则函数仍将失败。 - phihag
1
filesize 会抛出异常吗?因此,您的代码更改没有任何效果。另外,如果在 try..catch 中包装会起作用,那么您不需要跳过 is_file 检查,是吗? - phihag

3
$store_filesize = @filesize($file->filepath);
if ($store_filesize === FALSE) {
  throw new \Exception('filesize failed');
}

1

检查文件是否存在,是文件且可读

if (is_readable($file->filepath)) {
    $store_filesize = filesize($file->filepath);
}

2
这个程序存在竞态条件,因为在 is_readable 调用后文件可能已经被删除。此外,虽然你有获取文件大小的权限,但是没有读取文件的权限,所以这段代码会武断地忽略某些文件的大小。 - phihag

1

记得检查 null

if($file->filepath != null){
   $store_filesize = filesize($file->filepath);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接