error_reporting()
用於設定 php 的報錯級別並返回當前級別。(php 4, php 5)
函式能夠在執行時設定 error_reporting 指令。
php 有諸多錯誤級別,使用該函式可以設定在指令碼執行時的級別。
如果沒有設定可選引數 level, error_reporting() 僅會返回當前的錯誤報告級別。
引數level
新的 error_reporting 級別。 可以是乙個位掩碼也可以是乙個已命名的常量。
建議使用已命名的常量,以確保相容將來的版本。 由於錯誤級別的新增、整數取值範圍的增加,
較久的基於整數的錯誤級別不會總是和預期的表現一致。
level 可能的值:
值 常量 描述
11e_error 致命的執行錯誤。錯誤無法恢復,暫停執行指令碼。22
e_warning 執行時警告(非致命性錯誤)。非致命的執行錯誤,指令碼執行不會停止。34
e_parse 編譯時解析錯誤。解析錯誤只由分析器產生。48
e_notice 執行時提醒(這些經常是你**中的bug引起的,也可能是有意的行為造成的。)516
e_core_error php 啟動時初始化過程中的致命錯誤。632
e_core_warning php啟動時初始化過程中的警告(非致命性錯)。764
e_compile_error 編譯時致命性錯。這就像由zend指令碼引擎生成了乙個e_error。
8128
e_compile_warning 編譯時警告(非致性錯)。這就像由zend指令碼引擎生成了e_warning警告。
9256
e_user_error 自定義錯誤訊息。像用php函式trigger_error(程式設計師設定e_error)
10512
e_user_warning 自定義警告訊息。像用php函式trigger_error(程式設計師設的e_warning警告)
111024
e_user_notice 自定義的提醒訊息。像由使用php函式trigger_error(程式設計師e_notice集)
122048
e_strict 編碼標準化警告。允許php建議修改**以確保最佳的互操作性向前相容性。
134096
e_recoverable_error 開捕致命錯誤。像e_error,但可以通過使用者定義的處理捕獲(又見set_error_handler())
148191 e_all 所有的錯誤和警告(不包括 e_strict) (e_strict will be part of e_all as of php 6.0)
1416384 e_user_deprecated
1530719 e_all
15個正好對應二進位制的15位。
需要注意的是, 上述表中的字段, 不是一成不變的, 不同的php版本, 值可能會不同, 詳細的請參考 php預定義常量
任意數目的以上選項都可以用「或」來連線(用 or 或 |),這樣可以報告所有需要的各級別錯誤。
例如,下面的**關閉了使用者自定義的錯誤和警告,執行了某些操作,然後恢復到原始的報錯級別:
例:
1<?php
2error_reporting(0); //
禁用錯誤報告
3error_reporting(e_error | e_warning | e_parse);//
報告執行時錯誤
4error_reporting(e_all); //
報告所有錯誤
5error_reporting(e_all ^ e_notice); //
除e_notice報告所有錯誤,是在php.ini的預設設定
6error_reporting(-1); //
報告所有 php 錯誤
7error_reporting(3); //
不報e_notice
8error_reporting(11); //
報告所有錯誤
9ini_set('error_reporting', e_all); //
和 error_reporting(e_all); 一樣
10error_reporting(e_error | e_warning | e_parse | e_notice);//
表示php錯誤,警告,語法錯誤,提醒都返錯。
11 ?>
換算關係:
e_all: 十進位制為30719,換成二進位制為 111011111111111
e_notice:十進位制為8,換成二進位制為 1000
~e_notice:對e_notice進行取反操作, 變成0111
e_all & ~e_notice::e_all和 ~e_notice進行與操作,變成111011111110111,化成十進位制就是30711
可以看到e_all並不是顯示了所有的錯誤,第12位為0, 這一位的權重為2的11次方, 為2048,其實就是e_strict
的值,所以e_all
是顯示除e_strict
的所有錯誤級別。
e_all & ~e_notice
的二進位制可以看出,從右至左,第4位和第12位為0,第4位的權重為2的3次方,為8,就是e_notice
的值,所以是顯示除了e_strict
和e_notice
的所有錯誤。
兩個例子:
一、如果想顯示:e_warning
,e_notice
和e_parse
級別的錯誤,寫法與步驟:
1:先寫二進位制:
000000000000000
2:把對應的位置置為1
000000000001110
3:換算為10進製
2 ^ 1 + 2 ^ 2 + 2 ^ 3 = 14
二、error_reporting(2047) 換成 常量寫法
1:換算成二進位制
000001111111111
2:找對應關係
user_deprecated
0
deprecated
0recoverable_error
0strict
0user_notice
0user_warning
1user_error
1compile_warning
1compile_error
1core_warning
1core_error
1notice
1parse
1warning
1error
1版本區別:
5.4.0 e_strict 成為 e_all 的一部分
5.3.0 引入 e_deprecated 和 e_user_deprecated。
5.2.0 引入 e_recoverable_error。
5.0.0 引入 e_strict (但不包括在 e_all 之內)。
原因:如果設定為:e_all | e_strict,則表示記錄所有的錯誤資訊,可能會導致**出現一大堆的錯誤**;
但是對於程式設計師來說應該說是,可以把**優化到最優;一些非致命性錯誤雖然不影響程式的執行,
但是會使php的負擔加重,通常是增加了**程序(例如iis的應用程式池)的負擔。
其他的錯誤相關:
display_errors
錯誤回顯,一般常用語開發模式,但是很多應用在正式環境中也忘記了關閉此選項。錯誤回顯可以暴露出非常多的敏感資訊,為攻擊者下一步攻擊提供便利。推薦關閉此選項。 一旦某個產品投入使用,那麼第一件事就是應該將display_errors選項關閉,以免因為這些錯誤所透露的路徑、資料庫連線、資料表等資訊而遭到黑客攻擊。
在正式環境下用這個就行了,把錯誤資訊記錄在日誌裡。可以關閉錯誤回顯。 某個產品投入使用後,將php的log_errors開啟,預設是記錄到web伺服器的日誌檔案裡,比如apache的error.log檔案。 當然也可以記錄錯誤日誌到指定的檔案中。另外也可以設定error_log = syslog,使這些錯誤資訊記錄到作業系統的日誌裡。
1 # vim /etc/php.inidisplay_errors =off2 log_errors =on
3 error_log = /var/log/php-error.log
php.ini中display_errors = off失效的解決
問題:php設定檔案php.ini中明明已經設定display_errors = off,但是在執行過程中,網頁上還是會出現錯誤資訊。
解決:經
查log_errors=
on,據官方的說法,當這個log_errors設定為on,那麼必須指定error_log檔案,如果沒指定或者指定的檔案沒有許可權寫入,那麼照樣會輸
出到正常的輸出渠道,那麼也就使得display_errors 這個指定的off失效,錯誤資訊還是列印了 出來。於是將log_errors =
off,問題就解決了。
php的錯誤級別
fatal error 致命錯誤 指令碼終止執行 e error 致命的執行錯誤,錯誤無法恢復,暫停執行指令碼 e core error php啟動時初始化過程中的致命錯誤 e compile error 編譯時致命性錯,就像由zend指令碼引擎生成了乙個e error e user error 自...
php的錯誤級別
deprecated 不贊成使用,可能有漏洞可能效率低,以後的版本不支援等 notice 通知級別的錯誤 warning 警告 這個需要看 是不是 出了問題 以上三個程式仍然繼續向下執行 fatal error 致命錯誤 程式停止執行 parse error 解析錯誤了 直接掛了 程式停止執行 e ...
php錯誤級別
php.ini檔案中的error reporting引數 error reporting可以設定的引數如下 錯誤報告是位欄位。可以將數字加起來得到想要的錯誤報告等級。e all 所有的錯誤和警告 不包括 e strict e error 致命性的執行時錯誤 e warning 執行時警告 非致命性錯...