Pengendalian Ralat PHP
Dalam PHP, pengendalian ralat lalai adalah sangat mudah. Mesej ralat dihantar ke penyemak imbas dengan nama fail, nombor baris dan mesej yang menerangkan ralat.
Pengendalian Ralat PHP
Pengendalian ralat merupakan bahagian penting semasa membuat skrip dan aplikasi web. 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: 🎜>· Pelaporan ralat
Pengendalian ralat asas: menggunakan fungsi die()Contoh pertama menunjukkan skrip ringkas yang membuka fail teks:<?php $file=fopen("welcome.txt","r"); ?>
Amaran: fopen(welcome.txt ) [function.fopen]: gagal membuka strim:
Tiada fail atau direktori sedemikian dalam /www/test/test/test.php pada baris 2
Untuk mengelakkan pengguna mendapat mesej ralat seperti di atas, kami menyemak sama ada fail itu wujud sebelum mengaksesnya:
<?php if(!file_exists("welcome.txt")) { die("文件不存在"); } else { $file=fopen("welcome.txt","r"); } ?>
Sekarang, jika fail itu tidak wujud, anda akan mendapat mesej ralat seperti ini:
Fail tidak wujud
Kod di atas adalah lebih cekap daripada kod sebelumnya, ini kerana Ia menggunakan mekanisme pengendalian ralat mudah untuk menamatkan skrip selepas ralat.
Walau bagaimanapun, menamatkan skrip tidak semestinya sesuai. Mari kita periksa fungsi PHP alternatif untuk mengendalikan ralat.
Membuat pengendali ralat tersuai Membuat pengendali ralat tersuai 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):
Syntax
error_function(error_level,error_message,
error_file,error_line,error_context)
><🎜
Tahap pelaporan ralat ini ialah pelbagai jenis ralat yang dikendalikan oleh pengendali ralat yang ditentukan pengguna:
Sekarang, mari buat fungsi yang mengendalikan ralat:
<?php function customError($errno, $errstr) { echo "<b>Error:</b> [$errno] $errstr<br>"; echo "脚本结束"; die(); } ?>
Kod di atas ialah fungsi pengendalian ralat yang mudah. 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 ialah pengendali ralat terbina dalam. 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");
Oleh kerana kami mahu fungsi tersuai kami untuk Untuk mengendalikan semua ralat, set_error_handler() hanya memerlukan satu parameter, dan parameter kedua boleh ditambah untuk menentukan tahap ralat.
Contoh
Uji pengendali ralat ini dengan cuba mengeluarkan pembolehubah yang tidak wujud:
<?php // 错误处理函数 function customError($errno, $errstr) { echo "<b>Error:</b> [$errno] $errstr"; } // 设置错误处理函数 set_error_handler("customError"); // 触发错误 echo($test); ?>
Keluaran kod di atas kelihatan seperti ini:
Ralat : [8] Pembolehubah tidak ditentukan: ujian
Ralat Pencetus
Apabila pengguna memasukkan data dalam skrip, adalah 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 $test=2; if ($test>1) { trigger_error("变量值必须小于等于 1"); } ?>
Output kod di atas akan kelihatan seperti ini:
Notis: Nilai pembolehubah mestilah kurang daripada atau sama dengan 1
dalam /www/test/text.php pada baris 5
Anda boleh mencetuskan ralat mana-mana dalam skrip dengan menambah yang pertama Dengan dua parameter, anda boleh menentukan tahap ralat untuk 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.
· E_USER_NOTICE - 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 // 错误处理函数 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); } ?>
Output kod di atas akan kelihatan seperti ini:
Ralat: [512] Nilai pembolehubah mestilah kurang daripada atau sama dengan 1
Tamat skrip
Sekarang kita telah belajar cara mencipta ralat kita sendiri dan cara mencetuskannya, mari kita kaji pengelogan ralat.
Ralat pengelogan
Secara lalai, PHP menghantar pengelogan ralat ke sistem pengelogan pelayan atau fail mengikut konfigurasi error_log dalam php.ini. Dengan menggunakan fungsi error_log(), anda boleh menghantar log ralat ke fail tertentu atau destinasi jauh.
Menge-mel kepada diri sendiri mesej ralat ialah cara yang bagus untuk dimaklumkan tentang ralat tertentu.
Hantar mesej ralat melalui e-mel
Dalam contoh di bawah, jika ralat tertentu berlaku, kami akan menghantar e-mel dengan mesej ralat dan menamatkan skrip:
<?php // 错误处理函数 function customError($errno, $errstr) { echo "<b>Error:</b> [$errno] $errstr<br>"; echo "已通知网站管理员"; error_log("Error: [$errno] $errstr",1, "123123@qq.com","From: 123123@qq.com"); } // 设置错误处理函数 set_error_handler("customError",E_USER_WARNING); // 触发错误 $test=2; if ($test>1) { trigger_error("变量值必须小于等于 1",E_USER_WARNING); } ?>
The output kod di atas adalah seperti berikut:
Ralat: [512] Nilai pembolehubah mestilah kurang daripada atau sama dengan 1
Pentadbir laman web telah dimaklumkan
Diterima daripada kod di atas E-mel adalah seperti berikut:
Ralat: [512] Nilai pembolehubah mestilah kurang daripada atau sama dengan 1
Kaedah ini tidak sesuai untuk semua ralat. Ralat umum harus dilog pada pelayan menggunakan sistem pengelogan PHP lalai.