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)
参数 | 描述 |
error_level | 必需。为用户定义的错误规定错误报告级别。必须是一个数字。参见下面的表格:错误报告级别。 |
error_message | 必需。为用户定义的错误规定错误消息。 |
error_file | 可选。规定错误发生的文件名。 |
error_line | 可选。规定错误发生的行号。 |
error_context | 可选。规定一个数组,包含了当错误发生时在用的每个变量以及它们的值。 |
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 函数 trigger_error() 设置的 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 "脚本结束"; 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"); // 错误处理函数 function customError($errno, $errstr) { echo "<b>Error:</b> [$errno] $errstr"; } // 设置错误处理函数 set_error_handler("customError"); // 触发错误 echo($test); //关闭了所有的错误显示 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"); // 错误处理函数 function customError($errno, $errstr) { echo "<b>Error:</b> [$errno] $errstr<br>"; echo "脚本结束"; die(); } // 设置错误处理函数 set_error_handler("customError",E_USER_WARNING); // 触发错误 $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>