【问题标题】:How to find a reason when mkdir fails from PHP?当 mkdir 从 PHP 失败时如何找到原因?
【发布时间】:2010-10-29 23:29:44
【问题描述】:

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();

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

【问题讨论】:

  • Soulmerge 的回答是一个更好的选择,因为它可以告诉您错误而无需更换处理程序。
  • 请注意,错误处理程序存储在 PHP 中的堆栈中,这意味着对 restore_error_handler() 的调用将恢复以前的错误处理程序,无论是内置处理程序还是其他自定义处理程序。所以临时用 set_error_handler() 替换错误处理程序没有任何损失。

标签: php error-reporting mkdir


【解决方案1】:

我使用类似以下的东西:

if(! @mkdir('$fileLocation', 0777, $recursive = true)){
    $mkdirErrorArray = error_get_last();
    throw new Exception('cant create directory ' .$mkdirErrorArray['message'], 1);
}

【讨论】:

    【解决方案2】:

    你可以使用例外:

    像这样设置一些代码:

    function exception_error_handler($errno, $errstr, $errfile, $errline ) {
        throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
    }
    set_error_handler("exception_error_handler");
    

    然后就这样做:

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

    这应该可以满足您的需求。

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

    restore_error_handler()
    

    【讨论】:

    • +1 我喜欢这种方法,我没有测试过,但感觉很可靠。而且它看起来更友好;)
    • 另外,PHP 的 OO 库可以更好地处理所有这些问题 php.net/manual/en/class.splfileobject.php
    • @nickfox mkdir 不会引发异常,这就是自定义错误处理程序会引发异常的原因。至于 PHP 的 OO 库,是的,他们可能做得更好。
    • 这是正确答案,因为这也有利于在堆栈跟踪中显示正确的行号。
    【解决方案3】:

    您可以suppress the warning 使用error_get_last()

    if (!@mkdir($dir)) {
        $error = error_get_last();
        echo $error['message'];
    }
    

    【讨论】:

    • +1,但值得注意的是,如果 mkdir() 和 error_get_last() 之间发生另一个错误,这可能很脆弱,当您的代码变得更复杂时,这很可能会发生(作为一个极端的、不切实际的例子,一个刻度函数可能会在您调用 error_get_last() 之前运行并生成错误)。每当您使用任何类型的 get-last-error 函数时,这总是存在风险。
    猜你喜欢
    • 1970-01-01
    • 2021-01-30
    • 2012-09-24
    • 2010-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多