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

Posted

技术标签:

【中文标题】当 mkdir 从 PHP 失败时如何找到原因?【英文标题】:How to find a reason when mkdir fails from 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() 替换错误处理程序没有任何损失。 【参考方案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 函数时,这总是存在风险。

以上是关于当 mkdir 从 PHP 失败时如何找到原因?的主要内容,如果未能解决你的问题,请参考以下文章

File.mkdir 或 mkdirs 返回 false - 原因?

Apache 权限,PHP 文件创建,MKDir 失败

当没有找到记录并且失败时,PHP PDO fetch 返回 FALSE

Bash:如何测试 mkdir 命令失败?

请问一下定位怎么会经常获取位置失败,是啥原因?

PHP 运行 mkdir() Permission Denied 的原因