Pengendalian ralat PHP
Dalam PHP, pengendalian ralat lalai adalah mudah. Mesej ralat dihantar ke penyemak imbas dengan nama fail, nombor baris dan mesej yang menerangkan ralat.
Pengendalian Ralat PHP
Apabila membuat skrip dan aplikasi web , ralat pengendalian adalah bahagian yang penting. Jika kod anda tidak mempunyai pengekodan pengesanan ralat, program ini akan kelihatan tidak profesional dan membuka pintu kepada risiko keselamatan.
Tutorial ini merangkumi beberapa kaedah pengesanan ralat yang paling penting dalam PHP.
Kami akan menerangkan kaedah pengendalian ralat yang berbeza untuk anda:
· Pernyataan "die()" ringkas
· Ralat dan Ralat Tersuai Pencetus
· Pelaporan Ralat
Pengendalian Ralat Asas: Gunakan fungsi die()
Contoh pertama menunjukkan skrip mudah yang membuka fail teks:
<?php $open=fopen('error.txt','r'); echo $open; ?>
Jika fail tidak wujud, anda akan mendapat ralat seperti ini:
Amaran: fopen(error.txt) [function.fopen]: failed to open stream:
Tiada fail atau direktori sedemikian dalam /www/php/test/test.php pada baris 2
Untuk mengelakkan pengguna mendapat mesej ralat yang serupa dengan di atas, kami melawati Fail sebelum menyemak jika fail wujud:
<?php header("Content-type:text/html;charset=utf-8"); if(!file_exists('error.txt')){ die("文件不存在"); }else{ $file=fopen('error.txt','r'); } ?>
Sekarang, jika fail itu tidak wujud, anda akan mendapat mesej ralat seperti ini:
Fail tidak wujud
Berbanding dengan kod sebelumnya, kod di atas adalah lebih cekap kerana ia menggunakan mekanisme pengendalian ralat yang mudah untuk menamatkan skrip selepas ralat.
Walau bagaimanapun, penamatan skrip tidak semestinya sesuai. Mari kita periksa fungsi PHP alternatif untuk mengendalikan ralat.
Buat pengendali ralat tersuai
Buat tersuai Pengendali ralat adalah sangat mudah. Kami hanya mencipta fungsi khusus yang boleh dipanggil apabila ralat berlaku dalam PHP.
Fungsi mesti boleh mengendalikan sekurang-kurangnya dua parameter (tahap ralat dan mesej ralat), tetapi boleh menerima sehingga lima parameter (pilihan: fail, nombor baris dan konteks ralat):
error_function (error_level,error_message,error_file,error_line,error_context)
參數(shù) | 描述 |
error_level | 必需。為用戶定義的錯誤規(guī)定錯誤報告級別。必須是一個數(shù)字。參見下面的表格:錯誤報告級別。 |
error_message | 必需。為用戶定義的錯誤規(guī)定錯誤消息。 |
error_file | 可選。規(guī)定錯誤發(fā)生的文件名。 |
error_line | 可選。規(guī)定錯誤發(fā)生的行號。 |
error_context | 可選。規(guī)定一個數(shù)組,包含了當(dāng)錯誤發(fā)生時在用的每個變量以及它們的值。 |
Tahap pelaporan ralat
Tahap pelaporan ralat ini dikendalikan oleh pengendali ralat yang ditentukan pengguna Jenis yang berbeza daripada ralat:
| ?>Constant?>< ??> | ?> Penerangan?>?> | |||||||||||||||
E_WARNING | Larian bukan maut -kesilapan masa. Jangan jeda pelaksanaan skrip. | ||||||||||||||||
? > ??>?> 8?>?> | pemberitahuan masa jalan. Berlaku apabila skrip menemui kemungkinan ralat, tetapi juga boleh berlaku apabila skrip berjalan seperti biasa. | ||||||||||||||||
? > ?>?> 256?>?> | ?> ?>?>E_USER_ERROR?> ?> | Pengguna maut ralat yang dihasilkan. Ini serupa dengan E_ERROR yang ditetapkan oleh pengaturcara menggunakan fungsi PHP trigger_error(). | |||||||||||||||
? > ?>?> 512?>?> | ?> ?>?>E_USER_WARNING?> | Amaran yang dijana pengguna yang tidak membawa maut. Ini serupa dengan E_WARNING yang ditetapkan oleh pengaturcara menggunakan fungsi PHP trigger_error(). |
| ?> ?> ?>E_USER_NOTICE?> | 用戶生成的通知。這類似于程序員使用 PHP 函數(shù) trigger_error() 設(shè)置的 E_NOTICE。 | |||||||||
?>? ? ??>?>? ? 4096?>?> | ?> ?>?> ?>?>E_RECOVERABLE_ERROR?> | 可捕獲的致命錯誤。類似 E_ERROR,但可被用戶定義的處理程序捕獲。(參見 set 1 (_error_handler) = "top" style="border-width: 1px; gaya sempadan: pepejal; word-break: break-all;">?>? ? ??>?>? ? 8191?>?> | ?> ?>?>E_ALL?> | 所有錯誤和警告。(在 PHP 5.4 中,E_STRICT 成為 E_ALL 的一部分) |
Sekarang, mari kita cipta fungsi yang mengendalikan ralat:
<?php header("Content-type:text/html;charset=utf-8"); function customError($errno, $errstr) { echo "<b>Error:</b> [$errno] $errstr<br>"; echo "腳本結(jié)束"; die(); } ?>
Kod di atas adalah Mudah fungsi pengendalian ralat. Apabila ia dicetuskan, ia mendapat tahap ralat dan mesej ralat. Ia kemudian mencetak tahap ralat dan mesej, dan menamatkan skrip.
Sekarang kita telah mencipta fungsi pengendalian ralat, kita perlu menentukan masa untuk menyalakannya.
Tetapkan pengendali ralat
Pengendali ralat lalai PHP adalah Terbina dalam pengendali ralat. Kami akan mengubah fungsi di atas menjadi pengendali ralat lalai apabila skrip berjalan.
Pengendali ralat boleh diubah suai untuk digunakan hanya pada ralat tertentu, supaya skrip boleh mengendalikan ralat yang berbeza dengan cara yang berbeza. Walau bagaimanapun, dalam kes ini, kami akan menggunakan pengendali ralat tersuai kami untuk semua ralat:
set_error_handler("customError");
Sejak kami mahu fungsi tersuai kami mengendalikan semua ralat, set_error_handler() hanya memerlukan satu parameter dan parameter kedua boleh ditambah untuk menentukan tahap ralat
Contoh
Kami menggabungkan pengetahuan yang kami pelajari di atas dan cuba mengeluarkan pembolehubah yang tidak wujud untuk menguji pengendali ralat ini:
<?php header("Content-type:text/html;charset=utf-8"); // 錯誤處理函數(shù) function customError($errno, $errstr) { echo "<b>Error:</b> [$errno] $errstr"; } // 設(shè)置錯誤處理函數(shù) set_error_handler("customError"); // 觸發(fā)錯誤 echo($test); //關(guān)閉了所有的錯誤顯示 error_reporting(0); //顯示所有錯誤 //error_reporting(E_ALL); //顯示所有錯誤,但不顯示提示 //error_reporting(E_ALL & ~ E_NOTICE); ?>
Keputusan berjalan program:
Ralat: [8] Pembolehubah tidak ditentukan: ujian
Hasil larian memberitahu kami Tahap ralat ialah 8 , dan mesej ralat ialah: Pembolehubah tidak wujud
mencetuskan ralat
tempat pengguna memasukkan data dalam skrip , berguna untuk mencetuskan ralat apabila input pengguna tidak sah. Dalam PHP, tugas ini dicapai oleh fungsi trigger_error() .
Contoh
Dalam contoh ini, jika pembolehubah "ujian" lebih besar daripada "1", ralat akan berlaku:
<?php header("Content-type:text/html;charset=utf-8"); $test=2; if ($test>1) { trigger_error("變量值必須小于等于 1"); } ?>
Hasil pelaksanaan program:
Notis: Nilai pembolehubah mestilah kurang daripada atau sama dengan 1 dalam D:WWWAadvanced tutorialerrorerror_1.php pada baris 6
Anda boleh mencetuskan ralat di mana-mana dalam skrip dan dengan menambahkan parameter kedua, anda boleh menentukan tahap ralat yang dicetuskan.
Jenis ralat yang mungkin:
· E_USER_ERROR - Ralat masa jalan yang dijana pengguna maut. Ralat tidak dapat dipulihkan. Pelaksanaan skrip terganggu.
· E_USER_WARNING - Amaran masa jalan yang dijana pengguna yang tidak membawa maut. Pelaksanaan skrip tidak terganggu.
·?NOTIS_E_USER - Lalai. Pemberitahuan masa jalan yang dijana pengguna. Berlaku apabila skrip menemui kemungkinan ralat, tetapi juga boleh berlaku apabila skrip berjalan seperti biasa.
Contoh
Dalam contoh ini, jika pembolehubah "ujian" lebih besar daripada "1", ralat E_USER_WARNING berlaku. Jika E_USER_WARNING berlaku, kami akan menggunakan pengendali ralat tersuai kami dan menamatkan skrip:
<?php header("Content-type:text/html;charset=utf-8"); // 錯誤處理函數(shù) function customError($errno, $errstr) { echo "<b>Error:</b> [$errno] $errstr<br>"; echo "腳本結(jié)束"; die(); } // 設(shè)置錯誤處理函數(shù) set_error_handler("customError",E_USER_WARNING); // 觸發(fā)錯誤 $test=2; if ($test>1) { trigger_error("變量值必須小于等于 1",E_USER_WARNING); } ?>
Hasil pelaksanaan program:
Ralat: [512] Nilai pembolehubah mestilah Kurang daripada atau sama dengan 1
Skrip berakhir
Hasil yang sedang dijalankan memberitahu kita bahawa nilai tahap ralat ialah 512. Mesej ralat menjadi mesej gesaan yang kita tetapkan dengan fungsi trigger_error
Ralat mengelog
Di sesetengah syarikat, terdapat sistem pengumpulan log khas. Sistem pengumpulan log secara senyap akan membantu anda mengumpul ralat, amaran dan gesaan di sebalik tabir.
Terdapat juga beberapa syarikat yang tidak mempunyai sistem pengumpulan log khusus dan mengumpul log yang sedang berjalan dari pelayan melalui fail.
Antaranya: Ralat PHP, amaran mesti diterima.
Kemudian persoalan muncul - jika tahap pelaporan ralat ditetapkan dengan baik sebelum pengguna dapat melihatnya, bagaimana untuk mengumpul ralat ke dalam sistem log?
Berikut ialah item konfigurasi berkaitan yang perlu digunakan dalam php.ini. Dua item konfigurasi ini ialah:
| ?>?> Penerangan?>?> td > | ||||||||
0 | Hantar ke lokasi yang ditentukan log_ralat lalai | < / tr>||||||||
1 | Hantar ke lokasi e-mel yang ditentukan | 3 | Hantar ke lokasi fail yang ditentukan | < / jadual>