gpt4 book ai didi

php - 为什么 fopen 在寄存器关闭函数中失败?

转载 作者:行者123 更新时间:2023-12-03 07:38:41 25 4
gpt4 key购买 nike

我正在共享主机中的站点上工作。我无法访问 PHP ini 文件或 PHP ini_set 函数,也无法使用 php_flagphp_value 指令。

我正在使用 set_error_handler 函数来记录大多数错误,并尝试使用 register_shutdown_function 来记录 fatal error 。我在这里尝试了几种捕获 fatal error 的解决方案:How do I catch a PHP Fatal Error.我可以成功地使用那里的解决方案在屏幕上显示错误或调出自定义错误页面,并记录非 fatal error ,但我似乎无法记录 fatal error 。

这是我尝试的最简单版本:

    function errorHandler($num, $str, $file, $line) {

$now = strftime("%B %d, %Y at %I:%M %p", time());
$text = "{$now} → error {$num} in {$file}, line {$line}: {$str}\n";
$errorlog = "my_path/my_log";

$new = file_exists($errorlog) ? false : true;
if($handle = fopen($errorlog, 'a')) {
fwrite($handle, $text);
fclose($handle);
if($new) { chmod($errorlog, 0755); }
} else {
print("Could not open log file for writing"); //I'm using this to test
}

}

function fatalHandler() {
$error = error_get_last();
if($error) {
errorHandler($error["type"], $error["message"], $error["file"], $error["line"]);
}
}

set_error_handler("errorHandler");
register_shutdown_function("fatalHandler");

当我使用非 fatal error (如 echo $undefined_variable)对其进行测试时,它可以正常工作并正确记录错误。但是,如果我使用 fatal error 进行测试,例如 undefined_function(),它不会记录任何内容并打印“无法打开日志文件”。如果我在两个错误都存在的情况下进行测试,它会记录非 fatal error ,但不会记录 fatal error 。

您的问题已被确定为可能与另一个问题重复。如果那里的答案没有解决您的问题,请编辑以详细解释您问题的独特部分。

@Vic Seedoubleyew - 嗯,最明显的是你提到的问题中解决的警告 failed to open stream: ...etc 与我的情况无关。该警告从未发生过。测试消息:“无法打开日志文件进行写入”是我自己的消息,是我写给自己的,所以我会有一些证据表明if 正在处理语句。那条消息是我编造的。在我的问题中非常清楚地指出,该消息是我自己制作的。遇到我遇到的问题的任何人都永远不会收到消息 failed to open stream...etc,因此解决他们从未收到的消息的问题不会对他们有所帮助。我认为所有这一切的目的是真正帮助像我这样的傻瓜。

标题:“为什么 fopen 在寄存器关闭函数中失败”不是我的标题。那是别人的编辑。我的问题是为什么我不能在 register_shutdown_function 中写入日志。我不知道是 fopen 失败了还是有其他问题。我试图从函数中记录一些东西,但它没有用。从问题中删除既定目标(注销功能),并添加其他人的评估“为什么 fopen 失败”,实际上使得它对任何来这里寻求解决方案的人来说用处不大我正在经历。如果已经有一个问题解决了在关闭函数中写入文件的问题,我会找到它的。 “为什么 fopen 失败”太具体了,对于不知道为什么他们不能在函数中写入文件的人的搜索没有用。

我本来不想说任何关于编辑的事情,但既然你让我解释,我就解释一下。我知道每个人都可能会因为编辑而获得分数,但请花一点时间考虑一下您的编辑对问题的有用性的影响,因为有人遇到了我遇到的情况。

最佳答案

您使用的是自定义错误日志的相对路径吗?如果是这样,这个注释就register_shutdown_function page可能是相关的:

Working directory of the script can change inside the shutdown function under some web servers, e.g. Apache.

事实上,第二条评论说:

If you want to do something with files in function, that registered in register_shutdown_function(), use ABSOLUTE paths to files instead of relative. Because when script processing is complete current working directory chages to ServerRoot (see httpd.conf)

我要提到的其他事情:

您的变量 $error 和逻辑 if ($error) { ... 具有误导性。看,当您使用 register_shutdown_function 注册一个函数时,您是在告诉 PHP 每次您的脚本完成执行时调用该函数——无论是否有错误。这意味着即使您的脚本以非 fatal error 结束,甚至根本没有错误,也会调用 fatalHandler!

由于您有处理非 fatal error 的替代方法(使用 set_error_handler),您应该在 fatalHandler专门检查 fatal error >:

function fatalHandler() {
if( $error !== NULL && $error['type'] == E_ERROR) {
errorHandler($error["type"], $error["message"], $error["file"], $error["line"]);
header("HTTP/1.1 500 Internal Server Error");
exit();
}
}

查看 PHP 错误级别列表 here .

您可能没有意识到这一点,但是 PHP 有一个 built-in error-logging function .默认情况下,它会写入 php.ini 中为 error_log 指定的文件。

如果您对更高级的日志记录感兴趣,并且通常将您的 PHP 功能提升到一个新的水平,我建议您查看 Monolog包裹。它或多或少被认为是登录专业 PHP 社区的通用标准。

关于php - 为什么 fopen 在寄存器关闭函数中失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39338435/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com