记录致命错误

时间:2014-03-16 17:10:32

标签: php

我有一个简单的日志记录类,可以将日志消息写入日志文件。

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

所有帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

我认为这种情况正在发生,因为在死亡时,php会更改当前目录,导致您的代码将文件保存在错误的位置。尝试使用realpath预先配置绝对路径。例如:

public static set_target_file($file) {
    self::$file = realpath($file);
}

然后:

Logger::set_target_file('error.log');

使用self::$file中的fopen属性将导致代码查找绝对路径,而不是依赖于当前目录。