如何找到mkdir从PHP失败的原因?

Mil*_*kov 20 php error-reporting mkdir

PHP的mkdir函数只返回true和false.问题是它何时返回false.

如果我在启用错误报告的情况下运行,我会在屏幕上看到错误消息.我还可以在Apache日志中看到错误消息.但我想抓住消息的文本并用它做其他事情(例如通过IM发送给我自己).我如何获得错误文本?

更新:遵循艾曼的想法,我来到这里:

function error_handler($errno, $errstr) {
    global $last_error;
    $last_error = $errstr;
}

set_error_handler('error_handler');
if (!mkdir('/somedir'))
    echo "MKDIR failed, reason: $last_error\n";
restore_error_handler();
Run Code Online (Sandbox Code Playgroud)

但是,我不喜欢它,因为它使用全局变量.想要更清洁的解决方案吗?

sou*_*rge 55

您可以取消警告并使用error_get_last():

if (!@mkdir($dir)) {
    $error = error_get_last();
    echo $error['message'];
}
Run Code Online (Sandbox Code Playgroud)

  • +1,但值得注意的是,如果在mkdir()和error_get_last()之间发生另一个错误,这可能很脆弱,这可能在您的代码变得更复杂时发生(作为一个极端的,不切实际的例子,tick函数可以运行并生成在error_get_last()调用之前出错.每当您使用任何类型的get-last-error函数时,这始终是一个风险. (7认同)
  • @FrankFarmer 你是对的,但不幸的是 PHP 没有给我们比这更好的选择。 (2认同)

Kaz*_*zar 16

您可以使用例外:

设置一些代码如下:

function exception_error_handler($errno, $errstr, $errfile, $errline ) {
    throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}
set_error_handler("exception_error_handler");
Run Code Online (Sandbox Code Playgroud)

然后就是:

try {
   mkdir('/somedir');
} catch(ErrorException $ex) {
   echo "Error: " . $ex->getMessage();
}
Run Code Online (Sandbox Code Playgroud)

那应该做你想要的.

如果你想保留php错误处理程序,那么在尝试catch块后,只需调用:

restore_error_handler()
Run Code Online (Sandbox Code Playgroud)

  • 此外,PHP的OO库更好地处理所有这些东西http://www.php.net/manual/en/class.splfileobject.php (2认同)
  • @nickfox mkdir 不会抛出异常,这就是自定义错误处理程序抛出异常的原因。至于 PHP 的 OO 库,是的,它们可能做得更好。 (2认同)