我有一个简单的日志记录类,可以将日志消息写入日志文件。
class Logger {
// write a custom message to the log file
public static function log($msg) {
$hndl = fopen('log.log');
fwrite($hndl, $msg);
fclose($hndl);
}
// write errors to log file
public static err_callback($eno, $emsg) {
Logger::log($msg);
return false;
}
// write fatal errors to log file
public static ftl_callback() {
$error = error_get_last();
if ($error['type'] == E_ERROR) {
Logger::log($error['message']);
}
}
}
我注册了err_callback和ftl_callback函数,将PHP错误写入日志文件,如下所示:
register_shutdown_function('Logger::ftl_callback');
set_error_handler('Logger::err_callback');
直接调用Logger :: log()或发生非致命错误时,日志记录工作正常,但是在致命错误上我收到以下错误:
警告:fopen(log.log):无法打开流:第181行的E:_websites \ c \ phpSource \ Logger.php中的权限被拒绝
为什么我收到"权限被拒绝"发生致命错误时出错?这是PHP的问题还是配置问题?如果它是PHP,那么它有解决方法吗?
环境: PHP 5.3.8 IIS 6.1 Windows 7
所有帮助表示赞赏。
答案 0 :(得分:0)
我认为这种情况正在发生,因为在死亡时,php会更改当前目录,导致您的代码将文件保存在错误的位置。尝试使用realpath
预先配置绝对路径。例如:
public static set_target_file($file) {
self::$file = realpath($file);
}
然后:
Logger::set_target_file('error.log');
使用self::$file
中的fopen
属性将导致代码查找绝对路径,而不是依赖于当前目录。