PHP的错误处理方式(开发和上线)
对于PHP开发人员来说,一旦某个产品投入使用。应该马上将 display_errors选项关闭。以免由于这些错误所透露的路径、数据库连接、数据表等信息而遭到黑客攻击。
可是。不论什么一个产品在投入使用后。都难 免会有错误出现,那么怎样记录一些对开发人员实用的错误报告呢?我们能够在单独的文本文件里将错误报告作为日志记录。错误日志的记录,能够帮助开发人员或者 管理人员查看系统是否存在问题。 假设须要将程序中的错误报告写入错误日志中,仅仅要在PHP的配置文件里。将配置指令log_errors开启就可以。错误 报告默认就会记录到Webserver的日志文件里,比如记录到Apacheserver的错误日志文件error.log中。
当然也能够记录错误日志到指定的文件里 或发送给系统syslog,分别介绍例如以下:
1、使用指定的文件记录错误报告日志
使 用指定的文件记录错误报告日志使用指定的文件记录错误报告日志使用指定的文件记录错误报告日志 如果使用自己指定的文件记录错误日志,一定要确保将这个文 件存放在文档根文件夹之外,以降低遭到攻击的可能。而且该文件一定要让PHP脚本的运行用户(Webserver进程全部者)具有写权限。如果在Linux操作系 统中。将/usr/local/文件夹下的error.log文件作为错误日志文件,并设置Webserver进程用户具有写的权限。然后在PHP的配置文件里。 将error_log指令的值设置为这个错误日志文件的绝对路径。
须要将php.ini中的配置指令做例如以下改动:
1. error_reporting = E_ALL ;将会向PHP报告发生的每一个错误
2. display_errors = Off ;不显示满足上条 指令所定义规则的全部错误报告
3. log_errors = On ;决定日志语句记录的位置
4. log_errors_max_len = 1024 ;设置每一个日志项的最大长度
5. error_log = /usr/local/error.log ;指定产生的 错误报告写入的日志文件位置
PHP 的配置文件按上面的方式设置完毕以后,并又一次启动Webserver。
这样。在运行PHP的不论什么脚本文件时。所产生的全部错误报告都不会在浏览器中显示,而会记 录在自己指定的错误日志/usr/local/error.log中。此外,不仅能够记录满足error_reporting所定义规则的全部错误。并且 还能够使用PHP中的error_log()函数,送出一个用户自己定义的错误信息。
该函数的原型例如以下所看到的:
1. bool error_log ( string message [, int message_type [, string destination [, string extra_headers]]] )
此 函数会送出错误信息到Webserver的错误日志文件、某个TCPserver或到指定文件里。
该函数运行成功则返回TRUE。失败则返回FALSE。第一个參数 message 是必选项,即为要送出的错误信息。假设仅使用这一个參数,会按配置文件php.ini中所设置的位置处发送消息。第二个參数 message_type为整数值:0表示送到操作系统的日志中。1则使用PHP的Mail()函数,发送信息到某E-mail处,第四个參数 extra_headers亦会用到;2则将错误信息送到TCP server中。此时第三个參数destination表示目的地IP及Port。3则将信息 存到文件destination中。
假设以登入Oracle数据库出现故障的处理为例,该函数的使用例如以下所看到的:
1. <?php
2. if(!Ora_Logon($username, $password)){
3. error_log("Oracle数据库不可用!", 0); //将错误消息写入到操作系统日志中
4. }
5. if(!($foo=allocate_new_foo()){
6. error_log("出现大麻烦了!", 1, ". mydomain.com"); //发送到管理员邮箱中
7. }
8. error_log("搞砸了!", 2, "localhost:5000"); //发送到本机相应5000port的server中
9. error_log("搞砸了!", 3, "/usr/local/errors.log"); //发送到指定的文件里
10. ?
>
2、 错误信息记录到操作系统的日志里
错 误信息记录到操作系统的日志里错误信息记录到操作系统的日志里错误信息记录到操作系统的日志里 错误报告也能够被记录到操作系统日志里,但不同的操作系统 之间的日志管理有点差别。在Linux上错误语句将送往syslog。而在Windows上错误将发送到事件日志里。假设你不熟悉syslog。起码要知 道它是基于UNIX的日志工具,它提供了一个API来记录与系统和应用程序运行有关的消息。Windows事件日志实际上与UNIX的syslog同样, 这些日志通常能够通过事件查看器来查看。假设希望将错误报告写到操作系统的日志里,能够在配置文件里将error_log指令的值设置为syslog。
详细须要在php.ini中改动的配置指令例如以下所看到的:
1. error_reporting = E_ALL ;将会向PHP报告发生的每一个错误
2. display_errors = Off ;不显示 满足上条指令所定义规则的全部错误报告
3. log_errors = On ;决定日志语句记录的位置
4. log_errors_max_len = 1024 ;设置每一个日志项的最大长度
5. error_log = syslog ;指定产生的错误报告写入操作系统的日志里
除了一般的错误输出之外,PHP还同意向系统syslog中发送定制的消息。
尽管通过前面介绍的error_log()函数,也能够向syslog中发送定制的消息,但在PHP中为这个特性提供了须要一起使用的4个专用函数。
分别介绍例如以下:
define_syslog_variables()
在使用openlog()、syslog及closelog()三个函数之前必须先调用该函数。由于在调用该函数时。它会依据如今的系统环境为以下三个函数初使用化一些必需的常量。
openlog()
打开一个和当前系统中日志器的连接。为向系统插入日志消息做好准备。并将提供的第一个字符串參数插入到每一个日志消息中,该函数还须要指定两个将在日志上下文使用的參数。能够參考官方文档使用。
syslog()
该 函数向系统日志中发送一个定制消息。须要两个必选參数,第一个參数通过指定一个常量定制消息的优先级。比如LOG_WARNING表示一般的警 告,LOG_EMERG表示严重地能够预示着系统崩溃的问题。一些其它的表示严重程度的常量能够參考官方文档使用。第二个參数则是向系统日志中发送的定制 消息,须要提供一个消息字符串,也能够是PHP引擎在执行时提供的错误字符串。
closelog()
该函数在向系统日志中发送完毕定制消息以后调用,关闭由openlog()函数打开的日志连接。
假设在配置文件里。已经开启向syslog发送定制消息的指令,就能够使用前面介绍的四个函数发送一个警告消息到系统日志中,并通过系统中的syslog解析工具。查看和分析由PHP程序发送的定制消息。例如以下所看到的:
1.
2. define_syslog_variables();
3. openlog("PHP5", LOG_PID , LOG_USER);
4. syslog(LOG_WARNING, "警告报告向syslog中发送的演示。 警告时间:".date("Y/m/d H:i:s"));
5. closelog();
6. ?>
以Windows系统为例,通过右击"我的电脑"选择管理选项。然后到系统工具菜单中,选择事件查看器。再找到应用程序选项。就能够看到我们自己定制的警告消息了。上面这段代码将在系统的syslog文件里,生成类似以下的一条信息。是事件的一部分:
1. PHP5[3084], 警告报告向syslog中发送的演示。 警告时间:2009/03/26 04:09:11.
使 用指定的文件还是使用syslog记录错误日志。取决于你所在的Webserver环境。假设你能够控制Webserver,使用syslog是最理想的,由于你能利 用syslog的解析工具来查看和分析日志。但假设你的站点在共享server的虚拟主机中执行。就仅仅有使用单独的文本文件记录错误日志了。