程式報錯總是在所難免,儘管我們書寫程式碼時已經格外小心。
在開發php程式時,我們希望遇到php報錯,可以第一時間展示給我們,以便於調試。當程式開發完成,成為正式產品時,我們希望將沒有預測到的報錯資訊記錄到錯誤日誌中,而不是將這些報錯資訊展示給用戶,因為用戶極有可能利用這些暴露出腳本路徑、資料庫資訊或其他的報錯資訊進行一些破壞性的駭客行動。
PHP 的錯誤處理
php腳本在執行過程中遇到錯誤將以錯誤的形式處理,有些錯誤在報錯之後會終止腳本繼續執行,而有些不會,具體請參閱手冊。
php的報錯處理方式是根據以下配置選項進行,這些配置可以在程式碼中聲明以設置,也可以在php.ini檔案中設定。如果不需要經常改變這些配置,還是建議在php.ini檔案中設置,以使你的程式碼更清爽簡潔。
# 是否打印错误信息到浏览器/命令行界面 # 开发模式下建议开启,产品模式下强烈建议关闭 ini_set('display_errors', 'On'); # 是否记录错误信息到日志 # 开发模式和产品模式下都建议开启 ini_set('log_errors', 'On'); # 指定错误信息日志文件,若开启了 log_errors 选项,记得指定日志文件位置 # 要确保执行 php 脚本的系统用户拥有该文件的 write 权限,否则日志无法被写入 ini_set('error_log', '/usr/local/php/errors.log'); # 该选项用以设定错误报告的等级 # 等同于 error_reporting(E_ALL) # 无论开发模式还是产品模式下都建议开到E_ALL(报告所有的错误信息) # 产品模式下也需要设置此选项,因为关闭了 display_errors 并开启了 log_errors # 所以浏览器/命令行界面不会因此暴露报错信息 ini_set('error_reporting', E_ALL);
除此之外,php 也提供了在程式碼中將自訂的錯誤訊息記錄到錯誤日誌檔案的內建函數:
bool error_log ( string $message [, int $message_type = 0 [, string $destination [, string $extra_headers ]]] )
必選參數是message ,呼叫此函數會將message 寫入php.ini 中定義的error_log 檔案中。
使用者自訂的錯誤處理
另外,使用者可以透過函數:
mixed set_error_handler ( callable $error_handler [, int $error_types = E_ALL | E_STRICT ] )
以自訂的方式來處理腳本執行時出現的錯誤,如果使用者註冊了error_handler 並指定了error_types ,那麼當發生這些error_types 的錯誤時,將繞過php的標準錯誤處理程序
(也就是說既不會輸出錯誤訊息,也不會記錄錯誤訊息日誌),而是執行error_handler 中的處理程序。
函數的詳細用法請參考手冊(https://www.php.net/manual/zh/function.set-error-handler.php)
#相關文章教學建議: php教學
以上是開發模式與產品模式下的PHP報錯處理詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!