对于PHP开发者来说,一旦某个产品正式上线使用,应该立即将display_errors(在网页直接显示报错信息)的选项关闭,以免因为这些错误所透露的路径、数据库连接、数据表等信息而遭到黑客攻击。但是,任何一个产品在投入使用后,都难免会有错误出现,那么如何记录一些对开发者有用的错误报告呢?
答案是,将其记录到文件日志中。
一、如何开启和设置php的错误文件存放位置?
如果需要将程序中的错误报告写入错误日志中,只要在PHP的配置文件中(php.ini),将配置指令log_errors开启即可。错误报告默认就会记录到Web服务器的日志文件里,例如记录到Apache服务器的错误日志文件error.log中。当然也可以记录错误日志到指定的文件中 或发送给系统syslog,分别介绍如下:
1、使用指定的文件记录错误报告日志
如果使用自己指定的文件记录错误日志,一定要确保将这个文件存放在文档根目录之外,以减少遭到攻击的可能。并且该文件一定要让PHP脚本的执行用户(Web服务器进程所有者)具有写权限。
假设在Linux操作系统中,将/usr/local/目录下的error.log文件作为错误日志文件,并设置Web服务器进程用户具有写的权限。然后在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 = /www/phpernote/error.log ;指定产生的 错误报告写入的日志文件位置
PHP的配置文件按上面的方式设置完成以后,并重新启动Web服务器。这样,在执行PHP的任何脚本文件时,所产生的所有错误报告都不会在浏览器中显示,而会记录在自己指定的错误日志/www/phpernote/error.log文件中。
此外,不仅可以记录满足error_reporting所定义规则的所有错误,而且还可以使用PHP中的error_log()函数,送出一个用户自定义的错误信息。该函数的原型如下所示:
bool error_log ( string message [, int message_type [, string destination [, string extra_headers]]] )
此函数会送出错误信息到Web服务器的错误日志文件、某个TCP服务器或到指定文件中。该函数执行成功则返回TRUE,失败则返回FALSE。
第一个参数 message 是必选项,即为要送出的错误信息。如果仅使用这一个参数,会按配置文件php.ini中所设置的位置处发送消息。
第二个参数 message_type为整数值:0表示送到操作系统的日志中;1则使用PHP的Mail()函数,发送信息到某E-mail处。
第四个参数extra_headers亦会用到;2则将错误信息送到TCP服务器中,此时第三个参数destination表示目的地IP及Port;3则将信息存到文件destination中。
如果以登入Oracle数据库出现问题的处理为例,该函数的使用如下所示:
if(!Ora_Logon($username, $password)){
error_log("Oracle数据库不可用!", 0); //将错误消息写入到操作系统日志中
}
if(!($foo=allocate_new_foo()){
error_log("出现大麻烦了!", 1, ". mydomain.com"); //发送到管理员邮箱中
}
error_log("搞砸了!",2,"localhost:5000"); //发送到本机对应5000端口的服务器中
error_log("搞砸了!",3,"/usr/local/errors.log"); //发送到指定的文件中
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 ;指定产生的错误报告写入操作系统的日志里
二、如何设置ThinkPhp3框架的存放地址?
当我们使用框架时,直接更改php.ini中的设置就无效了。
1、确认我们可以更改的选项
首先打开./ThinkPHP/Library/Think/Log.class.php文件可以查看debug的默认设置如下:
return array(
'LOG_RECORD'=>true, // 进行日志记录
'LOG_RECORD_LEVEL' => array('EMERG','ALERT','CRIT','ERR','WARN','NOTIC','INFO','DEBUG','SQL'), // 允许记录的日志级别
'DB_FIELDS_CACHE'=> false, //数据库字段缓存 注意事项:DB_FIELDS_CACHE数据库字段缓存默认关闭状态,如果开启的话,会在Runtime\Data文件夹下生成文件缓存,并且修改表之后,如新加了字段,这个缓存无法记录你的操作,需要我们手动删除一次,对表的修改才会成功。
'SHOW_RUN_TIME'=>true, // 运行时间显示
'SHOW_ADV_TIME'=>true, // 显示详细的运行时间
'SHOW_DB_TIMES'=>true, // 显示数据库查询和写入次数
'SHOW_CACHE_TIMES'=>true, // 显示缓存操作次数
'SHOW_USE_MEM'=>true, // 显示内存开销
'SHOW_PAGE_TRACE'=>true, // 显示页面Trace信息 由Trace文件定义和Action操作赋值
'APP_FILE_CASE' => true, // 是否检查文件的大小写 对Windows平台有效
);
2、修改我们项目的设置
1、项目入口文件中修改index.php
// 开启调试模式 建议开发阶段开启 部署阶段注释或者设为false
define('APP_DEBUG',True);
2、修改./Application/Common/Conf/config.php
看到可以更改的选项后,就可以在config.php中进行相应的设置了
//'APP_DEBUG' => true, // 调试模式开关
'SHOW_RUN_TIME' => true, //运行时间显示
'SHOW_ADV_TIME' => true, //显示详细的运行时间
'SHOW_DB_TIMES' => true, //显示数据库的操作次数
'SHOW_CACHE_TIMES'=>true, //显示缓存操作次数
'SHOW_USE_MEM' => true, //显示内存开销
之后,日志文件会存放到:
/www/admin/localhost_80/wwwroot/Application/Runtime/Logs/Home
三、查看存放地址
1.通过php.ini来查看错误日志存放地址
echo ‘<?php phpinfo(); ?>’ | php 2>&1 |grep -i error_log
或者在一个php文件中输出 phpinfo();查看错误日志存放位置
2.查看日志存放位置
vi /etc/php.ini