PHP的错误记录机制及ThinkPhp的错误记录

对于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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值