PHP set_error_handler()函数的使用,phpseterrorhandler_PHP教程
PHP set_error_handler()函数的使用,phpseterrorhandler
我们写程序,难免会有问题(是经常会遇到问题 ),而PHP遇到错误时,就会给出出错脚本的位置、行数和原因。有很多人说,这并没有什么大不了。确实,在调试程序阶段,这确实是没啥的,而且我认为给出错误路径是必要的。
但泄露了实际路径的后果是不堪设想的,对于某些入侵者,这个信息可是非常重要,而事实上现在有很多的服务器都存在这个问题。有些网管干脆把PHP配置文件中的display_errors设置为Off来解决(貌似我们就是这样做的),但本人认为这个方法过于消极。
有些时候,我们的确需要PHP返回错误的信息以便调试。而且在出错时也可能需要给用户一个交待,甚至导航到另一页面。
那么,有啥解决办法呢?
set_error_handler()
PHP从4.1.0开始提供了自定义错误处理句柄的功能函数set_error_handler(),但很少数脚本编写者知道。set_error_handler这个函数可以很好地防止错误路径泄露,当然还有其它更多的作用。
set_error_handler的使用方法如下:
<span>string</span> set_error_handler ( callback error_handler [, <span>int</span> error_types])
现在我们就用自定义的错误处理把实际路径过滤掉。假设有一个变量$admin,我们是用来判断访问者是否是管理员的(可以通过IP或者登录的用户id来做这个判断)
<span>//</span><span>admin为管理员的身份判定,true为管理员。 </span><span>//</span><span>自定义的错误处理函数一定要有这4个输入变量$errno,$errstr,$errfile,$errline,否则无效。</span> <span> function my_error_handler($errno,$errstr,$errfile,$errline) { </span><span>//</span><span>如果不是管理员就过滤实际路径 </span> <span>if</span>(!<span>admin) { $errfile</span>=str_replace(getcwd(),<span>""</span><span>,$errfile); $errstr</span>=str_replace(getcwd(),<span>""</span><span>,$errstr); } </span><span>switch</span><span>($errno) { </span><span>case</span><span> E_ERROR: echo </span><span>"</span><span>ERROR: [ID $errno] $errstr (Line: $errline of $errfile) \n</span><span>"</span><span>; echo </span><span>"</span><span>程序已经停止运行,请联系管理员。</span><span>"</span><span>; </span><span>//</span><span>遇到Error级错误时退出脚本 </span> <span>break</span><span>; </span><span>case</span><span> E_WARNING: echo </span><span>"</span><span>WARNING: [ID $errno] $errstr (Line: $errline of $errfile) \n</span><span>"</span><span>; </span><span>break</span><span>; </span><span>default</span><span>: </span><span>//</span><span>不显示Notice级的错误 </span> <span>break</span><span>; } } </span>
这样就自定义了一个错误处理函数,那么怎么把错误的处理交给这个自定义函数呢?
<span>//</span><span> 应用到类 </span> set_error_handler(array(&$<span>this</span>,<span>"</span><span>appError</span><span>"</span><span>)); </span><span>//</span><span>示例的做法 </span> set_error_handler(<span>"</span><span>my_error_handler</span><span>"</span>);
so easy,这样,就可以很好地解决安全和调试方便的矛盾了。而且你还可以花点心思,使错误提示更加美观以配合网站的风格。
原作者给出了两点需要注意的地方,我也放出来吧,希望引起广大同胞们的注意:
<span>//</span><span>先定义一个函数,也可以定义在其他的文件中,再用require()调用 </span> <span>function myErrorHandler($errno, $errstr, $errfile, $errline) { </span><span>//</span><span>为了安全起见,不暴露出真实物理路径,下面两行过滤实际路径 </span> $errfile=str_replace(getcwd(),<span>""</span><span>,$errfile); $errstr</span>=str_replace(getcwd(),<span>""</span><span>,$errstr); </span><span>switch</span><span> ($errno) { </span><span>case</span><span> E_USER_ERROR: echo </span><span>"</span><span><b>My ERROR</b> [$errno] $errstr<br />\n</span><span>"</span><span>; echo </span><span>"</span><span> Fatal error on line $errline in file $errfile</span><span>"</span><span>; echo </span><span>"</span><span>, PHP </span><span>"</span> . PHP_VERSION . <span>"</span><span> (</span><span>"</span> . PHP_OS . <span>"</span><span>)<br />\n</span><span>"</span><span>; echo </span><span>"</span><span>Aborting...<br />\n</span><span>"</span><span>; exit(</span><span>1</span><span>); </span><span>break</span><span>; </span><span>case</span><span> E_USER_WARNING: echo </span><span>"</span><span><b>My WARNING</b> [$errno] $errstr<br />\n</span><span>"</span><span>; </span><span>break</span><span>; </span><span>case</span><span> E_USER_NOTICE: echo </span><span>"</span><span><b>My NOTICE</b> [$errno] $errstr<br />\n</span><span>"</span><span>; </span><span>break</span><span>; </span><span>default</span><span>: echo </span><span>"</span><span>Unknown error type: [$errno] $errstr<br />\n</span><span>"</span><span>; </span><span>break</span><span>; } </span><span>/*</span><span> Don't execute PHP internal error handler </span><span>*/</span> <span>return</span> <span>true</span><span>; } </span><span>//</span><span>下面开始连接MYSQL服务器,我们故意指定MYSQL端口为3333,实际为3306。 </span> $link_id=@mysql_pconnect(<span>"</span><span>localhost:3333</span><span>"</span>,<span>"</span><span>root</span><span>"</span>,<span>"</span><span>password</span><span>"</span><span>); set_error_handler(myErrorHandler); </span><span>if</span> (!<span>$link_id) { trigger_error(</span><span>"</span><span>出错了</span><span>"</span><span>, E_USER_ERROR); } </span>
好了,总结一下,下面是 set_error_handler 三种用法:
<span>class</span><span> CallbackClass { function CallbackFunction() { </span><span>//</span><span> refers to $this </span> <span> } function StaticFunction() { </span><span>//</span><span> doesn't refer to $this </span> <span> } } function NonClassFunction($errno, $errstr, $errfile, $errline) { } </span><span>//</span><span> 三种方法如下: </span> <span>1</span>: set_error_handler(<span>'</span><span>NonClassFunction</span><span>'</span>); <span>//</span><span> 直接转到一个普通的函数 NonClassFunction </span> <span>2</span>: set_error_handler(array(<span>'</span><span>CallbackClass</span><span>'</span>, <span>'</span><span>StaticFunction</span><span>'</span>)); <span>//</span><span> 转到 CallbackClass 类下的静方法 StaticFunction </span> <span>3</span>: $o =& <span>new</span><span> CallbackClass(); set_error_handler(array($o, </span><span>'</span><span>CallbackFunction</span><span>'</span>)); <span>//</span><span> 转到类的构造函数,其实本质上跟下面的第四条一样。 </span> <span>4</span>. $o = <span>new</span><span> CallbackClass(); </span><span>//</span><span> The following may also prove useful: </span> <span>class</span><span> CallbackClass { function CallbackClass() { set_error_handler(array(</span>&$<span>this</span>, <span>'</span><span>CallbackFunction</span><span>'</span>)); <span>//</span><span> the & is important </span> <span> } function CallbackFunction() { </span><span>//</span><span> refers to $this </span> <span> } } </span>

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

PHP和Python各有优势,选择应基于项目需求。1.PHP适合web开发,语法简单,执行效率高。2.Python适用于数据科学和机器学习,语法简洁,库丰富。

PHP是一种广泛应用于服务器端的脚本语言,特别适合web开发。1.PHP可以嵌入HTML,处理HTTP请求和响应,支持多种数据库。2.PHP用于生成动态网页内容,处理表单数据,访问数据库等,具有强大的社区支持和开源资源。3.PHP是解释型语言,执行过程包括词法分析、语法分析、编译和执行。4.PHP可以与MySQL结合用于用户注册系统等高级应用。5.调试PHP时,可使用error_reporting()和var_dump()等函数。6.优化PHP代码可通过缓存机制、优化数据库查询和使用内置函数。7

PHP和Python各有优势,选择依据项目需求。1.PHP适合web开发,尤其快速开发和维护网站。2.Python适用于数据科学、机器学习和人工智能,语法简洁,适合初学者。

PHP在电子商务、内容管理系统和API开发中广泛应用。1)电子商务:用于购物车功能和支付处理。2)内容管理系统:用于动态内容生成和用户管理。3)API开发:用于RESTfulAPI开发和API安全性。通过性能优化和最佳实践,PHP应用的效率和可维护性得以提升。

PHP仍然具有活力,其在现代编程领域中依然占据重要地位。1)PHP的简单易学和强大社区支持使其在Web开发中广泛应用;2)其灵活性和稳定性使其在处理Web表单、数据库操作和文件处理等方面表现出色;3)PHP不断进化和优化,适用于初学者和经验丰富的开发者。

PHP主要是过程式编程,但也支持面向对象编程(OOP);Python支持多种范式,包括OOP、函数式和过程式编程。PHP适合web开发,Python适用于多种应用,如数据分析和机器学习。

PHP适合web开发,特别是在快速开发和处理动态内容方面表现出色,但不擅长数据科学和企业级应用。与Python相比,PHP在web开发中更具优势,但在数据科学领域不如Python;与Java相比,PHP在企业级应用中表现较差,但在web开发中更灵活;与JavaScript相比,PHP在后端开发中更简洁,但在前端开发中不如JavaScript。

PHP和Python各有优劣,选择取决于项目需求和个人偏好。1.PHP适合快速开发和维护大型Web应用。2.Python在数据科学和机器学习领域占据主导地位。
