PHP的错误处理方式(开发和上线)

对于PHP开发者来说,一旦某个产品投入使用,应该立即将 display_errors选项关闭,以免因为这些错误所透露的路径、数据库连接、数据表等信息而遭到黑客攻击。但是,任何一个产品在投入使用后,都难 免会有错误出现,那么如何记录一些对开发者有用的错误报告呢?我们可以在单独的文本文件中将错误报告作为日志记录。错误日志的记录,可以帮助开发人员或者
管理人员查看系统是否存在问题。 如果需要将程序中的错误报告写入错误日志中,只要在PHP的配置文件中,将配置指令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 = /usr/local/error.log                ;指定产生的 错误报告写入的日志文件位置

PHP 的配置文件按上面的方式设置完成以后,并重新启动Web服务器。这样,在执行PHP的任何脚本文件时,所产生的所有错误报告都不会在浏览器中显示,而会记 录在自己指定的错误日志/usr/local/error.log中。此外,不仅可以记录满足error_reporting所定义规则的所有错误,而且
还可以使用PHP中的error_log()函数,送出一个用户自定义的错误信息。

该函数的原型如下所示:

1. 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数据库出现问题的处理为例,该函数的使用如下所示:

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");     //发送到本机对应5000端口的服务器中

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记录错误日志,取决于你所在的Web服务器环境。如果你可以控制Web服务器,使用syslog是最理想的,因为你能利 用syslog的解析工具来查看和分析日志。但如果你的网站在共享服务器的虚拟主机中运行,就只有使用单独的文本文件记录错误日志了。

时间: 2024-07-31 17:40:38

PHP的错误处理方式(开发和上线)的相关文章

ORM不好用,也许是因为你在以错误的方式在使用

有些团队会弃用对象关系映射框架(ORM),因为他们认为它性能不够好或者增加了太多不可知的因素,但那通常是由于用法不对.在最近的一次演讲中,Jimmy Bogard着重强调了在使用ORM时他认为正确和错误的方式,其中包括映射和查询问题.老品牌娱乐城 Jimmy是AutoMapper的创建者,同时也是一位微软最有价值专家.他将ORM描述成一种从数据库获取数据并传递给应用程序以及将数据传回数据库的工具.这可能看上去是个简单的问题,但实际上却相当复杂. Jimmy描述的一个映射问题是数据库生成的映射代码

小蚂蚁学习APP接口开发(7)—— APP接口实例——读取缓存方式开发APP接口的代码案例

从数据库中直接读取数据,虽然时效性很强,但是对数据库造成很大压力,尤其是在高访问量的情况下.这时候可以通过缓存,来有效的缓解了这一压力,虽然时效性有些不足,但是服务器的抗压能力却达到了很大的提高. 读取缓存方式的中心思想: 当请求进来时,先查看是否有缓存,如果有并且缓存还在有效时间内,不再查询数据库,直接返回缓存即可:如果没有或者已经过了有效时间,查询数据库,返回数据,同时生成一份新的缓存,供以后使用. 代码案例,还是在前几天的代码基础上进行改造完善. File静态缓存类    (原来的代码请参

使用AndroidStudio编译NDK的方法及错误解决方式

參考资料: [android ndk]macos环境下Android Studio中利用gradle编译jni模块及配置:http://demo.netfoucs.com/ashqal/article/details/21869151 ANDROID STUDIO, GRADLE AND NDK INTEGRATION:http://ph0b.com/android-studio-gradle-and-ndk-integration/ Gradle Plugin User Guide:http:

慕课网实战—《用组件方式开发 Web App全站 》笔记五-折线图组件开发

运用HTML5.CSS3.JS流行技术,采用组件式开发模式,开发Web App全站!技术大牛带你统统拿下不同类型的HTML5动态数据报告! <用组件方式开发 Web App全站 > 折现图绘制大致步骤 折线图画布 JavaScript CSS 折线图绘制网格线 // 水平网格线 100份 -> 10份 var step = 10; ctx.beginPath(); ctx.lineWidth = 1; ctx.strokeStyle = '#AAAAAA'; window.ctx = c

慕课网实战—《用组件方式开发 Web App全站 》笔记七-饼图和环图组件开发

运用HTML5.CSS3.JS流行技术,采用组件式开发模式,开发Web App全站!技术大牛带你统统拿下不同类型的HTML5动态数据报告! <用组件方式开发 Web App全站 > 饼图开发(绘制饼图准备) 饼图实现原理 饼图开发(绘制饼图) 代码 /* 饼图组件对象 */ var H5ComponentPie =function ( name, cfg ) { var component = new H5ComponentBase( name ,cfg ); // 绘制网格线 - 背景层 v

慕课网实战—《用组件方式开发 Web App全站 》笔记四-柱状图组件开发

运用HTML5.CSS3.JS流行技术,采用组件式开发模式,开发Web App全站!技术大牛带你统统拿下不同类型的HTML5动态数据报告! <用组件方式开发 Web App全站 > 柱图开发思路 水平柱图开发(HTML的DOM搭建) ???? ???? 水平柱图开发(CSS样式编写) /* 柱状组件样式 */ .h5_component_bar{ } .h5_component_bar .line{ height: 15px; font-size: 12px; line-height: 15p

《开源框架那点事儿23》:采用TinyDB组件方式开发

采用TinyDB组件方式开发 步骤 Icon 前文介绍四则运算的流程编程开发时,说过流程编排在开发重复功能时,可以利用已有的组件库快速开发.对于开发人员而言只需要简单配置流程就可以完成工作了. 开发增删改查的组件接口.本来这部分很花费时间,如果采用组件复用的话,就可以实现一次开发,终生受益. 配置curd.beans.xml和tinydb.xml. 使用流程编辑器定制组件流程curd.pageflow. 修改页面文件:list.page和operate.page,使之符合流程方式调用. 修改布局

从零开始学JAVA(09)-使用SpringMVC4 + Mybatis + MySql 例子(注解方式开发)

项目需要,继续学习springmvc,这里加入Mybatis对数据库的访问,并写下一个简单的例子便于以后学习,希望对看的人有帮助.上一篇被移出博客主页,这一篇努力排版整齐,更原创,希望不要再被移出主页了. 原创文章,后面附上源码,转载请注明出处http://www.cnblogs.com/lin557/p/6179618.html 一.运行环境 Eclipse Neon.1a Release (4.6.1) 官网下载 mysql-5.7.16-winx64(http://cdn.mysql.co

使用goroutine+channel和java多线程+queue队列的方式开发各有什么优缺点?

我感觉很多项目使用java或者c的多线程库+线程安全的queue数据结构基本上可以实现goroutine+channel开发能达到的需求,所以请问一下为什么说golang更适合并发服务端的开发呢?使用goroutine+channel和java多线程+queue队列的方式开发各有什么优缺点? 使用goroutine+channel和java多线程+queue队列的方式开发各有什么优缺点? >> golang 这个答案描述的挺清楚的:http://www.goodpm.net/postreply