PHP:我们如何记录发生的错误?

时间:2010-03-02 11:17:55

标签: php error-handling

例如,如果我们尝试访问某些api但失败,或尝试连接到我们的数据库但也失败。

6 个答案:

答案 0 :(得分:2)

有几种方法可以解决这个问题:

答案 1 :(得分:0)

您可以使用PHP错误处理。见set_error_handler

答案 2 :(得分:0)

php错误处理很棘手,需要考虑很多要点。在php中,我们有3种类型的错误:

  • 致命错误,例如调用未定义的函数。你无能为力。至少,在php.ini中设置display_errors = 0,log_errors = 1,这样就不会显示它们。更好的是,在bugs.php.net上写一份请愿书,并要求完全消除致命事件。致命错误真是太遗憾了!

  • “正常”警告和通知。最好将它们转换为例外,请参阅example #1

  • 例外 - 有趣的部分。您可以在适当的时候在代码中捕获它们+安装通用exception handler作为记录错误并告诉用户发生错误的最后机会选项。

答案 3 :(得分:0)

PHP有一个默认函数来记录错误;的 error_log

来自PHP.net的示例:

<?php
// Send notification through the server log if we can not
// connect to the database.
if (!Ora_Logon($username, $password)) {
    error_log("Oracle database not available!", 0);
}

// Notify administrator by email if we run out of FOO
if (!($foo = allocate_new_foo())) {
    error_log("Big trouble, we're all out of FOOs!", 1,
               "operator@example.com");
}

// another way to call error_log():
error_log("You messed up!", 3, "/var/tmp/my-errors.log");
?>

答案 4 :(得分:0)

了解广泛的日志记录。特别是在生产系统上。

  • 如果您只是尝试处理编程错误,首先应在代码中引发调试模式标志。严格的php处理也很有帮助。 (在php.ini中设置或通过apache vhost设置)。

  • 不要尝试浏览器/屏幕调试。如其他帖子中所述。在你的php ini中设置diplay_errors = 0和log_errors = 1(或者通过你的apache vhost设置设置)

  • 然后打开一个控制台窗口并执行:tail -f

    在你的php_error.log上(路径在php.ini或apache vhost设置中设置)

  • 如果您使用框架。使用框架调试工具(蛋糕)

  • 如果你有自己的框架/或只是代码。您可能应该编写一个具有调试功能的自己的异常处理程序类。

示例:

class MyFactory{
    public static function getLogger(){
        return new MyLogger();
    }
}

class ExampleExceptionWithLogging extends Exception{

    public __construct ($message=''){
        MyFactory::getLogger()->exception($message,$this->getTrace());
    }

}

class MyLogger{

    /**
    * @var string $logfile
    **/
    protected $logFile = '/var/log/php_error.log';

    /**
     * @param string $message
     * @param array $stackTrace
     **/
    public function exception($message,$stackTrace){
        $prefix = '[EXCEPTION] ';
        $this->writeOut($prefix.$message.' '.print_r($stackTrace,TRUE));
    }

    /** 
     * writes $value to given Logfile.
     * @param string $value
     * @param string|NULL $logFile FileName with full path
     */
    protected function writeOut($value,$logFile = NULL){
        if(is_null($logFile)){
                $logFile = $this->logFile;
        }
        error_log($value,3,$logFile);
    }
}

使用方法: 抛出新的ExampleExceptionWithLogging('Sample Message');

答案 5 :(得分:0)

这里有3个问题:

  1. 将程序流重定向到错误处理

  2. 捕获与解决错误相关的信息

  3. 将相关信息提供给相关方

  4. 正如其他人所说,(1)可以使用set_error_handler()处理,请注意您可以在代码中实例化您自己的客户错误,例如

    if (!$_SESSION['authenticated_user']) {
        $login="<a href='/login.php'>login</a>";
        trigger_error("Not authorized please $login", E_USER_WARNING);
    }
    

    捕获信息的既定做法是堆栈跟踪 - 这确实可以在PHP中使用,但是这是错误发生时PHP代码状态的静态快照 - 如果你已经正确测试了代码那么故障可能与你的PHP代码无关。它可以很好地指示您应该尝试修复代码的位置,但不能很好地指示您需要修复的内容。堆栈跟踪仍然是一个有用的工具,但它通常是运行任何时间长度的程序的唯一工具,而不是记录程序在运行中所做的事情的详细日志。除了明显的性能影响之外,浏览几兆字节的日志文件寻找错误就像在大海捞针一样。但是,由于PHP程序通常只是在退出时生成一个网页,这样就有机会在PHP变量中累积事件的详细日志,然后您可以选择仅在发生错误时将变量写入文件。

    与大多数关于编程的事情一样,这里有一个权衡 - 如果发生了你没想到/计划的错误,你怎么知道你的错误处理会起作用?

    在使数据可用方面,您可能不应该将其记录在数据库中 - 您的程序可能因为数据库无法正常工作而失败 - 错误处理必须非常非常强大。将其转储到唯一命名的文件中是一种很好的方法,可以避免因附加到统一日志文件而导致的文件争用问题。或者使用syslog工具。您甚至可以通过电子邮件发送错误的副本(但这又依赖于另一个复杂的子系统)。

    HTH

    下进行。