PHP的錯誤處理機制
php的錯誤處理是比較複雜的, 本文講解php中所有錯誤相關的重要知識點做一次梳理, 便於理解php的錯誤機制.
基礎知識
在此之前, 先熟悉一下php error的基礎知識
#預先定義常數
- ##運行時配置
- 異常
- 錯誤處理函數
#上面的值(數值或符號)用於建立一個二進位位元掩碼,來制定要報告的錯誤訊息。可以使用位元運算子來組合這些值或屏蔽某些類型的錯誤。請注意,在 php.ini 之中,只有'|', '~', '!', '^' 和 '&' 會正確解析。從使用的角度看, 可以分為三類:
- 使用者手動拋出的
E_USER_NOTICE,
E_USER_WARNING,
E_USER_ERROR,
E_USER_DEPRECATED - #使用者造成的
E_NOTICE#,
E_PARSE,
E_WARNING,
E_ERROR,
E_COMPILE_ERROR,
E_COMPILE_WARNING,
E_STRICT,
E_RECOVERABLE_ERROR - php核心造成的
E_CORE_ERROR,
E_CORE_WARNING
- 終止程式執行
程式終止, 進入處理錯誤流程
- 不終止程式執行
產生錯誤, 但程式仍可以繼續執行, 同樣進入錯誤處理流程
#error_reporting
報告錯誤的類型, 建議在開發/測試環境配置成
E_ALL, 解決所有的類型的錯誤後, 在生產環境配置
E_ALL & E_DEPRECATED, 則表示:報告除廢棄錯誤以外的所有錯誤
display_errors
是否顯示錯誤, 在生產環境中配置成false , 配合上面
error_reporting的設定, 則表示: 報告除廢棄錯誤外的所有錯誤, 但不顯示錯誤訊息.
- ##log_errors
錯誤記錄是否開啟,
生產環境需開啟
. 配合上面的兩項配置, 則表明: 報告除廢棄錯誤外的所有錯誤, 不顯示錯誤訊息, 但記錄(只有php自己可以操作錯誤訊息)到日誌中. - error_log
#指定錯誤的檔案
(syslog是特殊值)
.預設未被設定, 手冊中:
如果該配置沒有設置,則錯誤訊息會被傳送到SAPI 錯誤記錄器報告除廢棄錯誤外的所有錯誤, 不顯示錯誤訊息, 但記錄到一般情況下, 未設定會被記錄到apache/nginx的錯誤日誌中. 配合上面三項配置, 則表明: 報告除廢棄錯誤外的所有錯誤, 不顯示錯誤訊息, 但記錄到apache/nginx日誌中.若配置了檔案路徑, 則表明:
file_dir日誌中.
上面這幾項配置影響著php錯誤最基本的表現。當然,這些配置可以透過
在程式碼中更改或php-fpm配置更改錯誤處理函數
錯誤函數並不多, 最應該關注的就是
set_error_handler 和set_exception_handler
, 因為透過它們可以介入錯誤/異常的處理流程.
#先看看php手冊中的講解: Errors
簡單來說就是,
預設的處理流程就是透過設定完成, 但我們可以設定自訂的錯誤處理流程終止腳本執行的錯誤如何處理
#上文提到過, 錯誤有兩種, 那對於這種會終止腳本執行的錯誤如何處理?
set_error_handler
不能處理這種錯誤, 這一點很容易被忽略. 所以要尋找另一個方法.這個問題基本上是這樣完成的(還未見過其他方案):
// 终止脚本的错误会终止脚本执行 // 即会调用已通过register_shutdown_function注册的处理函数 // 由此可注册我们的错误处理流程, 这样就进入了自定义错误流程 register_shutdown_function('FatalErrorHandle'); ... FatalErrorHandle(array $error = null) { ... if (null === $error) { // 通过这种方式可以获取最后一条错误 $error = error_get_last(); } ... // log or other logic }
異常
#根據w3cPHP 異常處理中的講解:
異常處理用於在指定的錯誤(異常)情況發生時改變腳本的正常流程。這種情況稱為異常。當異常被觸發時,通常會發生:
當前程式碼狀態被保存
- 程式碼執行被切換到預先定義的異常處理器函數
根據情況,處理器也許會從已儲存的程式碼狀態重新開始執行程式碼,終止腳本執行,或從程式碼中外的位置繼續執行腳本
未被catch的異常會終止腳本執行並產生一個E-ERROR錯誤, 執行定義的異常處理, 若無則進行php預設的錯誤處理流程, 即記錄到日誌中. 但在程式設計概念上應該將異常與錯誤分開, 異常對於用戶而言是可預見的, 不符合預期的, 可控制的結構.
上文提到的set_exception_handler
就是處理異常的, 用法與set_error_handler
一致. 在各框架中的異常處理很成熟, 大致都是在set_exception_handler
中將Exception
轉移到框架可處理級別, 框架同時會開放良好的介面供用戶使用, 從而達到用戶控制異常處理的目的, 實現定制和擴展.
總結
php的錯誤處理機制總是被忽略, 但它對調試,監控錯誤有很大的作用. 本文主要介紹了其中的主要知識點, 並做了一個梳理, 希望對大家有用.更多的細節還請查看手冊.
學習資料
#預先定義常數
執行階段配置
錯誤處理函數
PHP的錯誤機制總結
異常
Errors
PHP 異常處理
Symfony Debug:是一個完整的應用, 可以說是一個全面的指導教程, 所有與error相關的知識點都涉及到了. 建議閱讀源代碼.
以上是PHP的錯誤處理的問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!

使用數據庫存儲會話的主要優勢包括持久性、可擴展性和安全性。 1.持久性:即使服務器重啟,會話數據也能保持不變。 2.可擴展性:適用於分佈式系統,確保會話數據在多服務器間同步。 3.安全性:數據庫提供加密存儲,保護敏感信息。

在PHP中實現自定義會話處理可以通過實現SessionHandlerInterface接口來完成。具體步驟包括:1)創建實現SessionHandlerInterface的類,如CustomSessionHandler;2)重寫接口中的方法(如open,close,read,write,destroy,gc)來定義會話數據的生命週期和存儲方式;3)在PHP腳本中註冊自定義會話處理器並啟動會話。這樣可以將數據存儲在MySQL、Redis等介質中,提升性能、安全性和可擴展性。

SessionID是網絡應用程序中用來跟踪用戶會話狀態的機制。 1.它是一個隨機生成的字符串,用於在用戶與服務器之間的多次交互中保持用戶的身份信息。 2.服務器生成並通過cookie或URL參數發送給客戶端,幫助在用戶的多次請求中識別和關聯這些請求。 3.生成通常使用隨機算法保證唯一性和不可預測性。 4.在實際開發中,可以使用內存數據庫如Redis來存儲session數據,提升性能和安全性。

在無狀態環境如API中管理會話可以通過使用JWT或cookies來實現。 1.JWT適合無狀態和可擴展性,但大數據時體積大。 2.Cookies更傳統且易實現,但需謹慎配置以確保安全性。

要保護應用免受與會話相關的XSS攻擊,需採取以下措施:1.設置HttpOnly和Secure標誌保護會話cookie。 2.對所有用戶輸入進行輸出編碼。 3.實施內容安全策略(CSP)限制腳本來源。通過這些策略,可以有效防護會話相關的XSS攻擊,確保用戶數據安全。

优化PHP会话性能的方法包括:1.延迟会话启动,2.使用数据库存储会话,3.压缩会话数据,4.管理会话生命周期,5.实现会话共享。这些策略能显著提升应用在高并发环境下的效率。

theSession.gc_maxlifetimesettinginphpdeterminesthelifespanofsessiondata,setInSeconds.1)它'sconfiguredinphp.iniorviaini_set().2)abalanceisesneededeededeedeedeededto toavoidperformance andunununununexpectedLogOgouts.3)

在PHP中,可以使用session_name()函數配置會話名稱。具體步驟如下:1.使用session_name()函數設置會話名稱,例如session_name("my_session")。 2.在設置會話名稱後,調用session_start()啟動會話。配置會話名稱可以避免多應用間的會話數據衝突,並增強安全性,但需注意會話名稱的唯一性、安全性、長度和設置時機。


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

Dreamweaver CS6
視覺化網頁開發工具

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

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

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

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