8

unlink在我的 PHP 页面上使用。在某些情况下,删除目录的权限可能会被拒绝。而不是拥有

Warning: unlink(stuff/New folder) [function.unlink]: Permission denied in ... on line 30

出现在呈现的页面上,有没有办法让我做一个“warning_get_last”来捕获最后一个给定的警告,所以我可以很好地输出它?还是error_get_last包括这些?

我知道我可以抑制警告,@unlink并且我还可以检查是否unlink返回 false,但我想知道如果它确实失败了随之而来的错误消息。

4

3 回答 3

12

用于error_reporting(0)在呈现的页面中不显示警告或任何错误。它仍然会显示在您的服务器错误日志中,您仍然可以使用它error_get_last()来获取最后一个错误。

你可以用这个来测试它:

error_reporting(0);
unlink('some file that does not exist'); // generates a warning
print_r(error_get_last());

已编辑:请注意,这error_reporting(0)会影响后续代码,因此您需要在完成要抑制错误显示的代码后将其设置回您想要的级别。

于 2012-10-11T04:56:36.693 回答
1

您编写设置自己的错误处理程序,在调用之前启用它,然后恢复正常。

使用set-error-handler打开错误处理程序,保存到全局变量(这是最简单的——也许不是最“正确”的)并显示是否有错误。或用户 error_get_last() (由 Trott 建议)。

function myErrorHandler($errno, $errstr, $errfile, $errline) {
    global $lastErrorString;
    $lastErrorString = $errstr;
    return false;
}

// Calling function:
global $lastErrorString;
$lastErrorString=false;
$old_error_handler = set_error_handler("myErrorHandler");
unlink($file);
restore_error_handler();
if ($lastErrorString !== false) {
    echo 'Went wrong: ' . $lastErrorString;
}
于 2012-10-11T05:01:13.620 回答
0

我不明白为什么以下提案比其他两个提案更糟糕;事实上,我会说它更好,因为它比罗比的答案更短,并且不像 Trott 的答案那样具有全局影响:

$ok = @unlink(...);
if ($ok === FALSE)
    throw new Exception(error_get_last()['message']);

运行时输出:

PHP Fatal error:  Uncaught exception 'Exception' with message 'unlink(foobar.txt): No such file or directory' in /Users/erik/code/test.php:5
Stack trace:
#0 {main}
  thrown in /Users/erik/code/test.php on line 5
于 2014-08-29T13:16:59.743 回答