1. 使用set_error_handler 自定义错误处理函数说明
set_error_handler 说明
mixed set_error_handler ( callable $error_handler [, int $error_types = E_ALL | E_STRICT ] )设置一个用户的函数(error_handler)来处理脚本中出现的错误。本函数可以用你自己定义的方式来处理运行中的错误, 例如,在应用程序中严重错误发生时,或者在特定条件下触发了一个错误(使用 trigger_error()),你需要对数据/文件做清理回收。重要的是要记住 error_types 里指定的错误类型都会绕过 PHP 标准错误处理程序, 除非回调函数返回了 FALSE。 error_reporting() 设置将不会起到作用而你的错误处理函数继续会被调用 ?? 不过你仍然可以获取 error_reporting 的当前值,并做适当处理。 需要特别注意的是带 @ error-control operator 前缀的语句发生错误时,这个值会是 0。同时注意,在需要时你有责任使用 die()。 如果错误处理程序返回了,脚本将会继续执行发生错误的后一行。以下级别的错误不能由用户定义的函数来处理: E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、 E_COMPILE_ERROR、 E_COMPILE_WARNING,和在 调用 set_error_handler() 函数所在文件中产生的大多数 E_STRICT。如果错误发生在脚本执行之前(比如文件上传时),将不会 调用自定义的错误处理程序因为它尚未在那时注册。参数error_handler用户的函数需要接受两个参数:错误码和描述错误的 string。 另外有可能提供三个可选参数:发生错误的文件名、发生错误的行号 以及发生错误的上下文(一个指向错误发生时活动符号表的 array)。 该函数可以表示为:handler ( int $errno , string $errstr [, string $errfile [, int $errline [, array $errcontext ]]] )errno第一个参数 errno,包含了错误的级别,是一个 integer。errstr第二个参数 errstr,包含了错误的信息,是一个 string。errfile第三个参数是可选的,errfile, 包含了发生错误的文件名,是一个 string。errline第四个参数是一个可选项, errline, 包含了错误发生的行号,是一个 integer。errcontext第五个可选参数, errcontext, 是一个指向错误发生时活动符号表的 array。 也就是说,errcontext 会包含错误触发处作用域内所有变量的数组。 用户的错误处理程序不应该修改错误上下文(context)。如果函数返回 FALSE,标准错误处理处理程序将会继续调用。error_types就像error_reporting 的 ini 设置能够控制错误的显示一样, 此参数能够用于屏蔽 error_handler 的触发。 如果没有该掩码, 无论 error_reporting 是如何设置的, error_handler 都会在每个错误发生时被调用。
2. set_error_handler的使用
header('content-type:text/html; charset=utf-8');//开启所有的错误报告error_reporting(-1);function customError($errno, $errmsg, $errfile, $errline){ if (!(error_reporting() & $errno)) { // This error code is not included in error_reporting return; } switch ($errno) { case E_USER_ERROR: echo "<b>My ERROR</b> [$errno] $errmsg<br />".PHP_EOL; echo " Fatal error on line $errline in file $errfile"; echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />".PHP_EOL; echo "Aborting...<br />\n"; // exit(1); break; case E_USER_WARNING: echo "<b>My WARNING</b> [$errno] $errmsg<br />".PHP_EOL; break; case E_USER_NOTICE: echo "<b>My NOTICE</b> [$errno] $errmsg<br />".PHP_EOL; break; default: echo "Unknown error type: [$errno] $errmsg<br />".PHP_EOL; break; } /* Don't execute PHP internal error handler */ return true;}set_error_handler('customError');echo $test;settype($var, 'king');// test();trigger_error('出错了!', E_USER_ERROR);echo '<hr>';//回收错误接管restore_error_handler();echo $king;echo '<hr>';set_error_handler('customError', E_ALL&~E_NOTICE);echo '<hr>';settype($var, 'king');echo 'continue...............';
3.自定义错误处理类
/** * 自定义错误处理类 */class MyErrorHandler { public $msg=''; public $filename=''; public $line=0; public $vars=array(); protected $_noticeLog = '/tmp/php_error.log'; function __construct($msg, $filename, $line, $vars) { $this->msg=$msg; $this->filename=$filename; $this->line=$line; $this->vars=$vars; } /** * [deal 自定义错误处理请求] * @param [int] $errno [错误号] * @param [string] $errmsg [错误描述] * @param [string] $errfile [出错的文件] * @param [int] $errline [出错的行号] * @param [array] $vars [错误触发处作用域内所有变量的数组] * @return [bool] */ public static function deal($errno, $errmsg, $errfile, $errline, $vars){ $self = new self($errmsg, $errfile, $errline, $vars); switch ($errno) { //致命级别的错误发邮件给管理员 case E_USER_ERROR: return $self->dealError(); break; case E_USER_WARNING: case E_WARNING: return $self->dealWarning(); break; case E_USER_NOTICE: case E_NOTICE: return $self->dealNotice(); break; default: //交给php本身的错误机制处理 return false; break; } } public function get_debug_print_backtrace($traces_to_ignore = 1){ $traces = debug_backtrace(); $ret = array(); foreach($traces as $i => $call){ if ($i < $traces_to_ignore ) { continue; } $object = ''; if (isset($call['class'])) { $object = $call['class'].$call['type']; if (is_array($call['args'])) { foreach ($call['args'] as &$arg) { $this->get_arg($arg); } } } $ret[] = '#'.str_pad($i - $traces_to_ignore, 3, ' ') .$object.$call['function'].'('.implode(', ', $call['args']) .') called at ['.$call['file'].':'.$call['line'].']'; } return implode("\n",$ret); } public function get_arg(&$arg) { if (is_object($arg)) { $arr = (array)$arg; $args = array(); foreach($arr as $key => $value) { if (strpos($key, chr(0)) !== false) { $key = ''; // Private variable found } $args[] = '['.$key.'] => '.get_arg($value); } $arg = get_class($arg) . ' Object ('.implode(',', $args).')'; } } /** * [dealError 处理错误级别的错误] * @return [type] [description] */ public function dealError(){ $backtrace=$this->get_debug_print_backtrace(); echo $backtrace; exit; $errorMsg=<<<EOF 出现了致命错误,如下 产生错误的文件:{$this->filename} 产生错误的信息:{$this->msg} 产生错误的行号:{$this->line} 追踪信息:{$backtrace} \n EOF; error_log($errorMsg, 1, '732578448@qq.com'); exit(1); } /** * [dealWarning 处理警告级别的错误] * @return [bool] */ public function dealWarning(){ $errorMsg=<<<EOF 出现了警告错误,如下 产生警告的文件:{$this->filename} 产生警告的信息:{$this->msg} 产生警告的行号:{$this->line} \n EOF; error_log($errorMsg, 1, '732578448@qq.com'); } /** * [dealNotice 处理通知级别的错误] * @return bool */ public function dealNotice(){ $datetime = date('Y-m-d H:i:s', time()); $errorMsg=<<<EOF 出现了通知错误,如下 产生通知的文件:{$this->filename} 产生通知的信息:{$this->msg} 产生通知的行号:{$this->line} 产生通知的时间:{$datetime} \n EOF; return error_log($errorMsg, 3, $this->_noticeLog); }}error_reporting(-1);set_error_handler(array('MyErrorHandler', 'deal'));ini_set('display_errors', 0);echo $var;trigger_error('zhiming', E_USER_ERROR);trigger_error('zhiming', E_USER_WARNING);
4.register_shutdown_function函数的使用
1.作用
1.通过register_shutdown_function函数,可以让我们设置一个当执行关闭时可以被调用的另一个函数。
2.当我们的脚本执行完成或意外死掉导致PHP执行即将关闭时,我们的这个函数将会被调用
2.使用场景
1.页面强制被停止
2.程序代码意外终止或超时
3.注意点
1.在register_shutdown_function之前不能有die() exit()等终止函数
版权声明:本文为博主原创文章,未经博主允许不得转载。

PHP在現代編程中仍然是一個強大且廣泛使用的工具,尤其在web開發領域。 1)PHP易用且與數據庫集成無縫,是許多開發者的首選。 2)它支持動態內容生成和麵向對象編程,適合快速創建和維護網站。 3)PHP的性能可以通過緩存和優化數據庫查詢來提升,其廣泛的社區和豐富生態系統使其在當今技術棧中仍具重要地位。

在PHP中,弱引用是通過WeakReference類實現的,不會阻止垃圾回收器回收對象。弱引用適用於緩存系統和事件監聽器等場景,需注意其不能保證對象存活,且垃圾回收可能延遲。

\_\_invoke方法允許對象像函數一樣被調用。 1.定義\_\_invoke方法使對象可被調用。 2.使用$obj(...)語法時,PHP會執行\_\_invoke方法。 3.適用於日誌記錄和計算器等場景,提高代碼靈活性和可讀性。

Fibers在PHP8.1中引入,提升了並發處理能力。 1)Fibers是一種輕量級的並發模型,類似於協程。 2)它們允許開發者手動控制任務的執行流,適合處理I/O密集型任務。 3)使用Fibers可以編寫更高效、響應性更強的代碼。

PHP社區提供了豐富的資源和支持,幫助開發者成長。 1)資源包括官方文檔、教程、博客和開源項目如Laravel和Symfony。 2)支持可以通過StackOverflow、Reddit和Slack頻道獲得。 3)開發動態可以通過關注RFC了解。 4)融入社區可以通過積極參與、貢獻代碼和學習分享來實現。

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

PHP不是在消亡,而是在不斷適應和進化。 1)PHP從1994年起經歷多次版本迭代,適應新技術趨勢。 2)目前廣泛應用於電子商務、內容管理系統等領域。 3)PHP8引入JIT編譯器等功能,提升性能和現代化。 4)使用OPcache和遵循PSR-12標準可優化性能和代碼質量。

PHP的未來將通過適應新技術趨勢和引入創新特性來實現:1)適應云計算、容器化和微服務架構,支持Docker和Kubernetes;2)引入JIT編譯器和枚舉類型,提升性能和數據處理效率;3)持續優化性能和推廣最佳實踐。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

記事本++7.3.1
好用且免費的程式碼編輯器

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

SublimeText3 Linux新版
SublimeText3 Linux最新版