对于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的虚拟主机中执行。就仅仅有使用单独的文本文件记录错误日志了。


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

  1. VS 2010 WebSite网站 使用CodeBehide 方式开发[Web应用程序项目转Web网站]

    由于生成Web应用程序的文件非常大,100M左右,上传到香港太慢,对于运维工作很不现实, 所以只能改用单个源代码文件上传方式,也就是Web网站方式,但VS2010中只提供Web网站转Web应用程序功能 ...

  2. 一、 kettle开发、上线常见问题以及防错规范步骤

    此篇说明对应的kettle版本是6.1,实际使用时7.x应该也是一样的. 一.    kettle开发流程(规范步骤,防止出错) (一)       Kettle设置检查 资源库连接 如果不加一下配置 ...

  3. Mybatis基础:Mybatis映射配置文件,Mybatis核心配置文件,Mybatis传统方式开发

    一.Mybatis快速入门 1.1 框架介绍 框架是一款半成品软件,我们可以基于这个半成品软件继续开发,来完成我们个性化的需求! 框架:大工具,我们利用工具,可以快速开发项目 (mybatis也是一个 ...

  4. PHP的错误处理方式

    错误类型 PHP 主要有两种错误:触发错误和异常.其中触发错误大概可以分为:编译错误.引擎错误和运行时错误,其中前两个是无法捕获的:异常都是可以捕获的,当没有尝试捕获时则会中断代码. 触发错误可以通过 ...

  5. VS2012 编译程序时报无法载入PDB文件错误解决方式

    VS2012 编译程序时报无法载入PDB文件错误解决方式 "ConsoleApplication1.exe"(Win32): 已载入"C:\Users\hp\Docume ...

  6. mapper代理方式开发

    使用mapper代理方式开发: 需要编写mapper接口,UserMapper.java需要编写映射文件,UserMapper.xml需要遵循一些开发规范,mybatis便可以自动生成mapper接口 ...

  7. Mybatis进阶学习笔记——动态代理方式开发Dao接口、Dao层(推荐第二种)

    1.原始方法开发Dao Dao接口 package cn.sm1234.dao; import java.util.List; import cn.sm1234.domain.Customer; pu ...

  8. mybatis入门--mapper代理方式开发

    不使用代理开发 之前,我们说了如何搭建mybatis框架以及我们使用mybatis进行简单的增删改查.现在,我们一起来构建一个dao层的完整代码.并用@test来模拟service层对dao层进行一下 ...

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

    项目需要,继续学习springmvc,这里加入Mybatis对数据库的访问,并写下一个简单的例子便于以后学习,希望对看的人有帮助.上一篇被移出博客主页,这一篇努力排版整齐,更原创,希望不要再被移出主页 ...

随机推荐

  1. JQuery插件ajaxFileUpload 异步上传文件(PHP版)

    太久没写博客了,真的是太忙了.善于总结,进步才会更快啊.不多说,直接进入主题. 前几天想在手机端做个异步上传图片的功能,平时用的比较多的JQuery图片上传插件是Uploadify这个插件,效果很不错 ...

  2. windows关闭aslr办法

    关闭aslr方便调试分析. 转:https://www.52pojie.cn/thread-377450-1-1.html windows关闭aslr办法 如 @Hmily  前辈所说, Window ...

  3. Anaconda 安装 OpenCV 遇到的问题

    1. 使用 pip install   安装 OpenCV 2. 对于 Ananconda 安装 OpenCV ,通常会遇到无法 import 的情况, 这是由于 anaconda 本身没有遵循 PE ...

  4. HDU 4085 Peach Blossom Spring

    斯坦纳树. 最后可以是森林,在计算出每个联通状态的最小费用后,还需要进行一次$dp$. #include<bits/stdc++.h> using namespace std; const ...

  5. MNIST神经网络的训练

    import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data 1.设置输入和输出节点的个数,配置 ...

  6. HDU 6060 RXD and dividing(dfs 思维)

    RXD and dividing Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Other ...

  7. chomd 1+2+4

    2,把目录 /tmp/sco修改为可写可读可执行 chmod 777 /tmp/sco 要修改某目录下所有的文件夹属性为可写可读可执行 chmod 777 * 把文件夹名称用*来代替就可以了 要修改/ ...

  8. c++源文件后缀名问题

    VC里用cpp作后缀名, 在GCC里默认采用C.cc.cxx作为后缀名 .cpp, .h (VS file).cc, .h (GCC file)   C中: 头文件后缀名: .h 源文件后缀名: .c ...

  9. MySQL笔记(三)之数据插入更新与删除

    INSERT INTO INSERT INTO 语句用于向表格中插入新的行. 语法: INSERT INTO 表 VALUES (值1, 值2,....) # 列数必须和值的个数匹配 INSERT I ...

  10. [待码][BZOJ1858]SCOI2010序列操作 jzyzoj1655

    待码的线段树.....太长了看上去不是很想写 [ 什么破理由啊摔,不要脸 ] 嗯先水几道再写