###0x01 PHP的错误处理
1.1 错误报告级别
PHP程序的错误发生一般归属于下列三个领域:
语法错误:
语法错误最常见,并且也容易修复。如:代码中遗漏一个分号。这类错误会阻止脚本的执行。
运行时错误:
这种错误一般不会阻止PHP脚本的执行,但会阻止当前要做的事情。输出一条错误,但php脚本继续执行
逻辑错误:
这种错误最麻烦,既不阻止脚本执行,也不输出错误消息。
一个异常(后面面向对象时会讲)则是在一个程序执行过程中出现的一个例外,或是一个事件,它中断了正常指令的运行,跳转到其他程序模块继续执行
1.2 调整错误报告级别
display_errors: 是否开启PHP输出错误报告的功能
值为:On(默认输出错误报告)、 Off(屏蔽所有错误信息)
在PHP脚本中可调用ini_set( )函数,动态设置php.ini配置文件.
如:ini_set("display_errors","On"); //显示所有错误信息
error_reporting: 设置不同的错误报告级别。
error_reporting = E_ALL & ~E_NOTICE
-- 可以抛出任何非注意的错误,默认值
error_reporting = E_ERROR | E_PARSE | E_CORE_ERROR
-- 只考虑致命的运行时错误、新解析错误和核心错误。
error_reporting = E_ALL & ~(E_USER_ERROR | E_USER_WARNING | E_USER_NOTICE)
-- 报告除用户导致的错误之外的所有错误。
在PHP脚本可以通过error_reporting( )函数动态设置错误报告级别。如:error_reporting(E_ALL);
1.3 使用trigger_error()函数来替代die( )
1.首先函数die()等同于exit(),两者如果执行都会终止PHP程序,而且可以在退出程序之前输出一些错误报告。trigger_error()则可以生成一个用户警告来代替,使程序更具有灵活性。
2.例如,trigger_error(“没有找到文件”,E_USER_ERROR)。使用trigger_error()函数来替代die(),你的代码在处理错误上会更具优势,对于客户程序员来说更容易处理错误。
1.4 自定义错误处理
自定义错误报告的处理方式,可以完全绕过标准的PHP错误处理函数,这样就可以按自己定义的格式打印错误报告,或改变错误报告打印的位置,以下几种情况可以考虑自定义错误处理。
可以记下错误的信息,及时发现一些生产环境出现的问题
可以屏蔽错误。
可以控制错误的输出。
可以作为调试工具。
使用set_error_handler()函数来设置用户自定义错误处理。
<?php
/**
定义Error_Handler函数,
作为set_error_handler()的第一个参数"回调"
@param int $error_level 错误级别
@param string $error_message 错误信息
@param string $file 错误所在文件
@param int $lin 错误所在行数
*/
function error_handler($error_level,
$error_message, $file, $line) {
$EXIT = FALSE;
switch( $error_level ) {
//提醒级别
case E_NOTICE:
case E_USER_NOTICE :
$error_type = 'Notice'; break;
//警告级别
case E_WARNING:
case E_USER_WARNING:
$error_type = 'Warning'; break;
//错误级别
case E_ERROR:
case E_USER_ERROR:
$error_type = 'Fatal Error';
$EXIT = TRUE; break;
//其他末知错误
default:
$error_type = 'Unknown';
$EXIT = TRUE; break;
}
//直接打印错误信息,也可以写文件或数据库
printf ("<font color='#FF0000'><b>%s</b></font>: %s in <b>%s</b> on line <b>%d</b><br>\n", $error_type, $error_message, $file, $line);
//若出现错误则跳转到友好错误提示页面
if(TRUE === $EXIT) {
echo '<script>location="er.html" </script>';
}
}
1.5 写错误日志
两种方式记录错误日志:
使用指定的文件记录错误报告日志
1、先配置php.ini:
error_reporting = E_ALL //将向PHP发送每个错误
display_errors=Off //不显示错误报告
log_errors=On //决定日志语句记录的位置
log_errors_max_log=1024 // 每个日志项的最大长度
error_log=G:/myerror.log //指定错误写进的文件
2、使用函数:在php文件中使用error_log()来记录日志,就可以将信息写入到myerror.log文件中
如:error_log("登录失败了!");
<?php
if(!ora_logon($username, $password)){
//将错误消息写入到操作系统日志中
error_log("Oracle数据库不可用!", 0);
}
if(!($foo=allocate_new_foo()){
//发送到管理员邮箱中
error_log("出现大麻烦了!", 1, "webmaster@www.mydomain.com");
}
//发送到本机对应5000端口的服务器中
error_log("搞砸了!", 2, "localhost:5000");
//发送到指定的文件中
error_log("搞砸了!", 3, "/usr/local/errors.log");
?>
错误日志记录到操作系统的日志里
查看日志:
如windows系统,通过右击“我的电脑”-> 选择管理选项->在系统工具菜单中选择事件查看器->在应用程序选项中即可看到日志了。
<?php
define_syslog_variables();
openlog("PHP5", LOG_PID , LOG_USER);
syslog(LOG_WARNING, "警告报告向syslog中发送的演示,警告时间: "
.date("Y/m/d H:i:s"));
closelog();
?>
###0x02 PHP的日期和时间
2.4 使用微妙计算PHP脚本执行时间
2.1 UNIX时间戳
Unix 时间戳 :
自从 Unix 纪元(格林威治时间 1970 年 1 月 1 日 00:00:00)到当前时间的秒数 .
相关函数:
time( ): 函数返回一个当前系统的时间戳
mktime( ): 取得一个日期的 Unix 时间戳
格式:int mktime(时[,分[,秒[,月[,日[,年[,is_dst区]]]]]]);
注意:is_dst参数表示是否为夏时制,PHP5.10后此参数已废除。
strtotime( ):将任何英文文本的日期时间描述解析为 Unix 时间戳
格式:int strtotime ( string $time [, int $now ] )
直接echo time();就是返回时间戳但是可以整化一下
echo date("Y-m-d H:i:s",time());
2.2 在PHP中获取日期和时间
getdate -- 取得日期/时间信息
格式:array getdate ( [int timestamp] )
返回一个根据 timestamp 得出的包含有日期信息的结合数组。如果没有给出时间戳则认为是当前本地时间。数组中的单元如下:
2.3 日期和时间的格式化输出
date -- 格式化一个本地时间/日期
格式:string date ( string format [, int timestamp] )
返回将整数 timestamp 按照给定的格式字串而产生的字符串。如果没有给出时间戳则使用本地当前时间。换句话说,timestamp 是可选的,默认值为 time()(当前时间戳)。
例如:
echo date(“Y年m月d日 H:i:s”); //2010年10月28日 14:22:28
常用参数:
Y:四位数年 m:月01-12 n:月1-12 d:天01-31 j:天1-31
H:时24时制 h:小时12制 i:分钟00-59 s:秒00-59 w:星期几0-6
A:上午AM或下午PM a:上午am或下午pm。
2.4修改PHP的默认时区
修改PHP的默认时区有两种方式:
1、修php.ini配置文件:
date.timezone = Etc/GMT+8
2、date_default_timezone_set( ): -- 设定用于一个脚本中所有日期时间函数的默认时区 。
如:date_default_timezone_set(“PRC”); //中国时区。
3、date_default_timezone_get( ): -- 获取当前时区
2.5使用微秒计算PHP脚本执行时间
microtime -- 返回当前 Unix 时间戳和微秒数
格式:mixed microtime ( [bool get_as_float] )
microtime() 当前 Unix 时间戳以及微秒数。本函数仅在支持 gettimeofday() 系统调用的操作系统下可用。
如果调用时不带可选参数,本函数以 "msec sec" 的格式返回一个字符串,其中 sec 是自 Unix 纪元(0:00:00 January 1, 1970 GMT)起到现在的秒数,msec 是微秒部分。字符串的两部分都是以秒为单位返回的。
如果给出了 get_as_float 参数并且其值等价于 TRUE,microtime() 将返回一个浮点数。