当前位置: 首页 > 后端技术 > PHP

PHP常用模块的错误处理

时间:2023-03-29 15:47:32 PHP

第1章错误报告级别PHP程序错误一般分为以下三个方面:语法错误:语法错误是最常见的,也是最容易修复的。例如:代码中缺少一个分号。此类错误会阻止脚本执行。运行时错误:这种错误一般不会阻止PHP脚本的执行,但是会阻止当前正在做的事情。输出错误,但php脚本继续执行。逻辑错误:这种错误最麻烦,既不会阻止脚本执行,也不会输出错误信息。说明ApacheWeb服务器和PHP引擎之间的关系。case://语法错误,忘记加分号echo"123"//运行时错误echo'123';functionlaowang(){echo'456';}laoliu();//逻辑错误,想输出旧的隔壁王某,结果是一顶帽子。从系统的角度来看,这不是一个错误。if(1==1){echo"hat";}else{echo"NeighborKing";}PHP系统有哪些报错等级?错误级别的描述和设置可以在php.ini中找到。//表示打开所有错误提示但屏蔽NOTICE错误error_reporting=E_ALL&~E_NOTICE//直接关闭所有错误提示,一般在开发阶段,但上线后一般选择offdisplay_errors=off/on级别常量错误值错误报告描述E_ERROR1致命运行时错误(阻止脚本执行)E_WARNING2运行时警告(非致命错误)E_PARSE4语法解析错误E_NOTICE8运行时通知消息(可能是也可能不是问题)E_CORE_ERROR16PHP启动初始化期间的致命错误E_CORE_WARNING32PHP启动时初始化期间的警告(非致命错误)E_COMPILE_ERROR64编译时致命错误E_COMPILE_WARNING128编译时警告(非致命错误)E_USER_ERROR256用户定义的致命错误E_USER_WARNING512用户定义的警告(非致命错误)E_USER_NOTICE1024用户自定义提醒(通常是错误)E_STRICT2048Coding标准化警告(建议如何修改以实现向前兼容性)E_ALL6143所有错误、警告和注意信息//错误值一般是系统定义的常量echoE_ERROR;//1//1248...6143原理//使用的二进制,采用点亮原理,错了就点亮。//000000000001--->这是第一个错误。在实际开发中,没有人关注错误级别和错误值。如果报错,直接看通用型,直接找BUG。在实际开发中,我们其实需要做很多的错误处理。编写函数相对容易。就麻烦多了,需要考虑的因素也很多。手册和字典一样厚。第二章调整报错级别动态设置是否输出PHP错误信息,只在当前脚本中生效,不影响php.ini的全局设置。display_errors:是否开启PHP输出错误报告的功能。取值:On(默认输出错误报告),Off(屏蔽所有错误信息)在PHP脚本中可以调用ini_set()函数动态设置php.ini配置文件。例如:ini_set("display_errors","On");//显示所有错误信息//设置是否输出错误信息ini_set('display_errors',"off");//关闭ini_set('display_errors',"on");//打开ini_set('display_errors',0);//关闭ini_set('display_errors',1);//打开//调用函数测试aa();error_reporting:设置不同的错误报告级别。error_reporting=E_ALL&~E_NOTICE--可以抛出任何非通知错误,默认值。错误报告=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);//动态设置错误级别error_reporting(E_ALL);//实验,报告所有错误echo$a;//启用除通知外的所有错误error_reporting(E_ALL&~E_NOTICE);echo$a;case:ini_set('display_errors',1);//Enableerror_reporting(E_ALL);//Enableallerrors$sum=0;//这里如果被屏蔽,第一次使用sum时,一个notice会上报一个errorifthevariableisnotdefinedfor($i=0;$i<=10;$i++){$sum+=$i;}echo$sum;strlen();//字符串长度函数,如果没有给定参数,会报警告错误,不影响程序Executeecho"aaaaaaaa";aa();//致命错误,调用不存在的函数时程序会终止。php.ini中的设置选项不正确(了解即可,无需深究)。配置命令默认值说明display_startup_errorsOff是否显示PHP引擎在初始化时遇到的错误log_errorsOff决定日志语句记录位置error_logNull设置错误可以发送到sysloglog_errors_max_len1024每个日志项的最大长度,以字节为单位,设置0表示指定最大长度。ignore_repeated_errorsOff是否忽略同一文件同一行重复出现的错误信息ignore_repeated_sourceOff忽略同一文件不同文件不同行重复出现的错误信息。track_errorsOff启用该指令会导致PHP将最新的错误消息存储在$php_errormsg中。第三章PHP日志记录方法1)使用文件记录(推荐)。2)错误日志记录在操作系统日志中。思考:为什么需要登录?1、自己开发时查询方便。一般框架都有自己的日志功能,只需要开启就OK了。2、可以使用运行日志开发相应的后台日志功能,供管理员查询,方便管理。3.1使用文件记录首先配置php.ini文件error_reporting=E_ALL//将每一个错误发送给PHPdisplay_errors=Off//不显示错误报告*log_errors=On//确定日志语句的位置log_errors_max_len=1024//everyThemaximumlengthofthelogitem*error_log=G:/myerror.log//指定错误写入的文件Test:a();//关注日志文件conunt();//关注日志文件以上记录的是系统错误日志。思考:是否可以对用户操作做一个人工日志?使用功能:使用error_log()在PHP文件中记录日志,可以将信息写入myerror.log文件。error_log("用户xxx要删除ID为69的用户名,已记录在日志中,请注意本小子");参数参考手册。rigger_error()函数记录日志在上一节中,我们使用error_log()来上报自定义的错误信息,让系统记录,只记录信息。使用trigger_error()比error_log更灵活,可以指定级别和文件位置。//你可以使用系统提供的错误级别来记录你在日志中定义的错误信息。默认为通知级别trigger_error("用户xxx要删除ID为69的用户名,已记录在日志中,请注意本小子",E_USER_ERROR);3.2错误日志记录在操作系统日志中首先配置php.ini文件error_reporting=E_ALL//将每个错误发送给PHP*display_errors=Off//不显示错误报告*log_errors=On//确定日志语句记录的位置log_errors_max_len=1024//最大值lengthofeachlogentry*error_log=syslog//指定写入错误的文件使用四个函数来记录日志://define_syslog_variables();初始化系统日志的配置//openlog();打开一个日志链接//syslog();发送日志记录//closelog();关闭日志链接test:aa();//不再显示日志,而是记录在系统日志中。目前的发展已经淘汰了这种方法。这四个功能必须同时使用。课后可以自己做实验。代码如下:define_syslog_variables();openlog("PHP5",LOG_PID,LOG_USER);syslog(LOG_WARNING,"警告报告已发送至syslogDemo,警告时间:".date("Y/m/dH:i:s"));关闭日志();如何查看Window系统日志。在电脑上右击--->管理(G)--->系统工具--->事件查看器--->Windows日志--->应用第四章自定义错误处理自定义错误报告的处理方式,你可以完全绕过标准的PHP错误处理函数,所以你可以按照你定义的格式打印错误报告,或者改变打印错误报告的位置。说白了就是不要使用系统的错误提示和将它们更改为您自己的。set_error_handler()--设置用户自定义的错误处理。参数:mixedset_error_handler(callable$error_handler[,int$error_types=E_ALL|E_STRICT])回调函数:回调函数。所谓回调函数:functiondemo(){return"我不要";}functiondemo2(){return"我也不要";}functionresult($suan){return$suan();}//函数名demo1和函数名demo2作为字符串参数传递给result函数,那么上面的函数就可以自动调用了,这里说demo1,demo2是result的回调函数echoresult('演示2');case://回调函数还需要参数Receive,参考手册/*errno第一个参数errno包含错误级别,是一个整数。errstr的第二个参数errstr包含错误信息,是一个字符串。errfile的第三个参数是可选的,errfile,包含了发生错误的文件名,是一个字符串。errline的第四个参数是可选项errline,包含了错误发生的行号,是一个整数。*/functioncallbackset($errno,$errstr,$errfile,$errline){echo"自定义错误处理:错误级别:{$errno},错误信息:{$errstr}。文件:{$errfile}行{$errline}";}set_error_handler("callbackset");//设置为报错的返回信息交给callbackset处理echo$aa;特别注意:E_ERROR、E_PARSE、E_CORE_ERROR、E_CORE_WARNING、E_COMPILE_ERROR、E_COMPILE_WARNING都不会产生影响,通常会以原来的形式显示。