当 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 - 原因?