PHP常用功能块.ppt
附加四 PHP常用功能模块,预习检查,在PHP程序中错误发生一般归属于哪些领域?写入日志的方式有哪两种,如何配置?什么是UNIX时间戳?我们如何使用date()函数格式化时间?,本章任务,1.PHP的错误处理2.PHP的时间和日期,1.PHP的错误处理,1.1 错误报告级别1.2 调整错误报告级别1.3 使用trigger_error()函数来替代die()1.4 自定义错误处理1.5 写错误日志,1.1 错误报告级别,PHP程序的错误发生一般归属于下列三个领域:语法错误:语法错误最常见,并且也容易修复。如:代码中遗漏一个分号。这类错误会阻止脚本的执行。运行时错误:这种错误一般不会阻止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,测试错误报告 测试错误报告,确定PHP错误报告行为的配置指令,1.3 使用trigger_error()函数来替代die(),首先函数die()等同于exit(),两者如果执行都会终止PHP程序,而且可以在退出程序之前输出一些错误报告。trigger_error()则可以生成一个用户警告来代替,使程序更具有灵活性。例如,trigger_error(“没有找到文件”,E_USER_ERROR)。使用trigger_error()函数来替代die(),你的代码在处理错误上会更具优势,对于客户程序员来说更容易处理错误。,1.4 自定义错误处理,自定义错误报告的处理方式,可以完全绕过标准的PHP错误处理函数,这样就可以按自己定义的格式打印错误报告,或改变错误报告打印的位置,以下几种情况可以考虑自定义错误处理。可以记下错误的信息,及时发现一些生产环境出现的问题可以屏蔽错误。可以控制错误的输出。可以作为调试工具。使用set_error_handler()函数来设置用户自定义错误处理。,%s:%s in%s on line%dn,$error_type,$error_message,$file,$line);/若出现错误则跳转到友好错误提示页面 if(TRUE=$EXIT)echo location=er.html;,通过上面测试代码可以很好解决安全和调试方面的矛盾,但注意E_ERROR、E_PARSE、E_CORE_ERROR、E_CORE_WARNING、E_COMPILE_ERROR、E_COMPILE_WARNING是不会被这个句柄处理的,也就是会用原始的方式显示,不过通常情况下不会发生。使用set_error_handler()后,error_reporting()将会失效。也就是所有错误都是由自定义的函数处理。,error_reporting(0);/屏蔽程序中的错误 set_error_handler(error_handler);/这个才是关键点,把错误的处理交给error_handler()echo$novar;/使用末定义的变量要报 notice 的 echo 3/0;/除以0要报警告的 trigger_error(Trigger a fatal error,E_USER_ERROR);/自定义一个错误?,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(登录失败了!);,使用指定的文件记录错误报告日志,错误日志记录到操作系统的日志里,1、先配置PHP.ini文件中error_reporting=E_ALL/将向PHP发送每个错误display_errors=Off/不显示错误报告log_errors=On/决定日志语句记录的位置。log_errors_max_log=1024/每个日志项的最大长度error_log=syslog/指定到系统日志中。2、使用四个函数来记录日志:define_syslog_variables();/为系统日志初始化配置openlog();/打开一个日志链接syslog();/发送一条日志记录closelog();/关闭日志链接,错误日志记录到操作系统的日志里,查看日志:如windows系统,通过右击“我的电脑”-选择管理选项-在系统工具菜单中选择事件查看器-在应用程序选项中即可看到日志了。,2.PHP的日期和时间,2.1 UNIX时间戳2.2 在PHP中获取日期和时间2.3 修改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),?php echo date(Y-m-d,strtotime(now);/输出:2012-04-05 echo date(Y-m-d,strtotime(8 may 2012);/输出:2012-05-08 echo date(Y-m-d,strtotime(+1 day);/输出:2012-04-06 echo date(Y-m-d,strtotime(last monday);/输出:2012-04-02$now=strtotime(now);/当前时间$endtime=strtotime(2014-08-18 08:08:08);/设定毕业时间,转成时间戳$second=$endtime-$now;/获取毕业时间到现在时间的时间戳(秒数)$year=floor($second/3600/24/365);/从这个时间戳中换算出年头数$temp=$second-$year*365*24*3600;/从时间戳中去掉整年的秒数,就剩下月份的秒数$month=floor($temp/3600/24/30);/从这个时间戳中换算出月数$temp=$temp-$month*30*24*3600;/从时间戳中去掉整月的秒数,就剩下天的秒数$day=floor($temp/3600/24);/从这个时间戳中换算出剩余的天数$temp=$temp-$day*3600*24;/从时间戳中去掉整天的秒数,就剩下小时的秒数$hour=floor($temp/3600);/从这个时间戳中换算出剩余的小时数$temp=$temp-$hour*3600;/从时间戳中去掉整小时的秒数,就剩下分的秒数$minute=floor($temp/60);/从这个时间戳中换算出剩余的分数$second1=$temp-$minute*60;/最后就只有剩余的秒数了 echo 距离培训毕业还有$year年$month月$day天$hour小时$minute分$second1秒;,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-6A:上午AM或下午PM a:上午am或下午pm。,2.4 修改PHP的默认时区,修改PHP的默认时区有两种方式:1、修php.ini配置文件:date.timezone=Etc/GMT+82、date_default_timezone_set():-设定用于一个脚本中所有日期时间函数的默认时区。如:date_default_timezone_set(“PRC”);/中国时区。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()将返回一个浮点数。,总 结,本章必须掌握的知识点:修改错误等级写错误日志UNIX时间戳计算和各种格式的转换获取和并能格式化日期可以修改PHP的默认时间微秒的使用了解错误报告级别类型了解如何自定义错误,谢 谢,