Pemprosesan Ralat PHP
- Halaman Sebelumnya E-mail Sekuriti PHP
- Halaman Berikutnya Exception PHP
Di PHP, pengelolaan kesalahan baku adalah sederhana. Satu pesan akan dihantar ke pelayar, pesan itu mengandungi nama fail, bilangan baris serta pesan deskripsi kesalahan.
Pemprosesan Ralat PHP
Pada masa mencipta skrip dan aplikasi web, penanganan kesalahan adalah bagian penting. Jika kod anda kurang dari pengkodean deteksi kesalahan, program kelihatannya kurang profesional dan membuka kesempatan risiko keselamatan.
Panduan ini memaparkan beberapa cara deteksi kesalahan yang paling penting di PHP.
Kami akan memberikan penjelasan tentang berbagai cara penanganan kesalahan:
- Perintah "die()" yang sederhana
- Kesalahan yang disesuaikan dan pemecat kesalahan
- Laporan kesalahan
Penanganan kesalahan dasar: gunakan fungsi die()
Contoh skrip yang sederhana untuk membuka fail teks:
<?php $file=fopen("welcome.txt","r"); ?>
Jika fail tidak wujud, anda akan mendapat kesalahan seperti ini:
Amaran: fopen(welcome.txt) [function.fopen]: gagal membuka aliran: Tiada fail atau direktori di C:\webfolder\test.php pada baris 2
Untuk menghindari pengguna mendapat mesej kesalahan seperti di atas, kita mengesan adanya fail sebelum mengakses fail:
<?php if(!file_exists("welcome.txt")) { die("Fail tak ditemui"); } else { $file=fopen("welcome.txt","r"); } ?>
Sekarang, jika fail tidak wujud, anda akan mendapat mesej kesalahan seperti ini:
Fail tak ditemui
Bandingkan dengan kod sebelumnya, kod di atas lebih efektif, kerana ia mengambil mekanisme penanganan kesalahan yang sederhana untuk menghentikan skrip setelah kesalahan.
Walau bagaimanapun, menghentikan skrip secara mudah bukan selalu cara yang sesuai. Bagaimanakah fungsi alternatif PHP untuk menghadapi kesalahan?
Membuat penanganan kesalahan yang disesuaikan
Membuat penanganan kesalahan yang disesuaikan sangat mudah. Kita hanya membuat fungsi khusus, yang dapat dipanggil fungsi itu saat terjadi kesalahan dalam PHP.
Fungsi ini mesti dapat menghadapi sekurang-kurangnya dua parameter (tingkatan kesalahan dan mesej kesalahan), tetapi boleh menerima maksimum lima parameter (pilihan: fail, nombor baris serta konteks kesalahan):
Sintaks
error_function(error_level, error_message, error_file, error_line, error_context)
Parameter | Deskripsi |
---|---|
error_level | Wajib. Tingkatan laporan kesalahan yang ditakrifkan pengguna. Harus adalah nilai bilangan. Lihat jadual di bawah: Tingkatan laporan kesalahan. |
error_message | Wajib. Mesej kesalahan yang ditetapkan untuk kesalahan yang ditakrifkan pengguna. |
error_file | Pilihan. Tentukan nama file tempat terjadi kesalahan. |
error_line | Pilihan. Tentukan nomor baris tempat terjadi kesalahan. |
error_context | Pilihan. Tentukan array yang mengandung setiap variabel yang digunakan saat terjadi kesalahan serta nilai mereka. |
Tingkat Laporan Kesalahan
Tingkat laporan kesalahan ini adalah jenis kesalahan yang berbeda yang program penanganan kesalahan dimaksudkan untuk menangani:
Nilai | Konstanta | Deskripsi |
---|---|---|
2 | E_WARNING | Kesalahan run-time yang tidak parah. Tidak menghentikan eksekusi skrip. |
8 | E_NOTICE | Pemberitahuan Run-time. Skrip mendeteksi kemungkinan terjadi kesalahan, tetapi mungkin juga terjadi saat skrip berjalan dengan baik. |
256 | E_USER_ERROR | Kesalahan yang dibuat pengguna yang parah. Mirip dengan E_ERROR yang disetel programer menggunakan fungsi PHP trigger_error(). |
512 | E_USER_WARNING | Peringatan pengguna yang tidak parah. Mirip dengan E_WARNING yang disetel programer menggunakan fungsi PHP trigger_error(). |
1024 | E_USER_NOTICE | Pemberitahuan yang dibuat pengguna. Mirip dengan E_NOTICE yang disetel programer menggunakan fungsi PHP trigger_error(). |
4096 | E_RECOVERABLE_ERROR | Kesalahan yang dapat ditangkap yang parah. Mirip dengan E_ERROR, tetapi dapat ditangkap oleh penanganan kesalahan yang ditentukan pengguna (lihat set_error_handler()). |
8191 | E_ALL | Semua kesalahan dan peringatan, kecuali tingkat E_STRICT. (Dalam PHP 6.0, E_STRICT adalah bagian dari E_ALL) |
Sekarang, biarkan kita membuat fungsi untuk menangani kesalahan:
function customError($errno, $errstr) { echo "<b>Error:</b> [$errno] $errstr<br />"; echo "Akhir Skrip"; die(); }
Kode di atas adalah fungsi penanganan kesalahan yang sederhana. Saat ia diaktifkan, ia akan mengambil tingkat kesalahan dan pesan kesalahan. kemudian ia akan menampilkan tingkat kesalahan dan pesan, dan menghentikan skrip.
Sekarang, kami telah membuat fungsi penanganan kesalahan, kami perlu menentukan kapan fungsi ini diaktifkan.
Set Error Handler
Program penanganan kesalahan baku PHP adalah program penanganan kesalahan yang baku. Kami ingin mengubah fungsi di atas menjadi program penanganan kesalahan baku selama skrip berjalan.
Dapat diubah program penanganan kesalahan untuk hanya berlaku bagi kesalahan tertentu, sehingga skrip dapat menangani kesalahan dengan cara yang berbeda.
set_error_handler("customError");
Kami menginginkan fungsi pribadi kita untuk menangani semua kesalahan, set_error_handler() hanya memerlukan parameter satu, dapat menambahkan parameter kedua untuk menentukan tingkat kesalahan.
Contoh
Uji pengendali kesalahan ini dengan mencuba untuk output variable yang tak wujud:
<?php //error handler function function customError($errno, $errstr) { echo "<b>Error:</b> [$errno] $errstr"; } //set error handler set_error_handler("customError"); //trigger error echo($test); ?>
Output kode di atas seharusnya seperti ini:
Error: [8] Variable tak terdefinisi: test
Mengaktifkan Kesalahan
Pada tempat penginputan pengguna di skrip, mengaktifkan kesalahan yang berkesan jika input pengguna tidak sah. Dalam PHP, tugas ini dijalankan oleh trigger_error().
Contoh
Dalam contoh ini, jika variable "test" lebih besar daripada "1", kesalahan akan terjadi:
<?php $test=2; if ($test>1) { trigger_error("Nama nilai mesti 1 atau di bawah"); } ?>
Output kode di atas seharusnya seperti ini:
Notice: Nama nilai mesti 1 atau di bawah di C:\webfolder\test.php di baris 6
Anda boleh membangunkan kesalahan di mana-mana tempat di skrip, melalui parameter kedua yang ditambahkan, anda dapat menentukan tingkatan kesalahan yang diaktifkan.
Jenis kesalahan yang mungkin:
- E_USER_ERROR - Kesalahan run-time pengguna yang parah. Kesalahan tidak dapat pulih. Eksekusi skrip dihentikan.
- E_USER_WARNING - Amat tidak menyebabkan kesalahan pengguna run-time. Eksekusi skrip tidak dihentikan.
- E_USER_NOTICE - Lalai. Pemberitahuan run-time pengguna. Skrip mendapati kesalahan yang mungkin, juga boleh terjadi sewaktu skrip berjalan dengan baik.
Contoh
Dalam contoh ini, jika variable "test" lebih besar daripada "1", kesalahan E_USER_WARNING akan terjadi. Jika kesalahan E_USER_WARNING terjadi, kita akan menggunakan pengendali kesalahan yang disediakan dan mengakhiri skrip:
<?php //error handler function function customError($errno, $errstr) { echo "<b>Error:</b> [$errno] $errstr<br />"; echo "Akhir Skrip"; die(); } //set error handler set_error_handler("customError",E_USER_WARNING); //trigger error $test=2; if ($test>1) { trigger_error("Nilai mesti 1 atau di bawah",E_USER_WARNING); } ?>
Output kode di atas seharusnya seperti ini:
Error: [512] Nilai mesti 1 atau di bawah Akhir Skrip
Sekarang, kami telah menghabiskan masa untuk menghasilkan sendiri error, serta mengeaktifkannya, kini kita kajian tentang perekod kesalahan.
Perekod Kesalahan
Secara lalai, berdasarkan konfigurasi error_log di php.ini, PHP mengirimkan rekod kesalahan kepada sistem perekod kesalahan pelayan atau fail. Dengan menggunakan fungsi error_log(), anda dapat mengirimkan rekod kesalahan ke tempat tujuan yang ditentukan.
Menghantar mesej kesalahan kepada diri sendiri melalui e-mel adalah cara yang baik untuk menerima pemberitahuan kesalahan yang ditentukan.
Menghantar mesej kesalahan melalui E-Mail
Dalam contoh di bawah, jika kesalahan tertentu terjadi, kami akan mengirim e-mail dengan pesan kesalahan dan mengakhiri skrip:
<?php //error handler function function customError($errno, $errstr) { echo "<b>Error:</b> [$errno] $errstr<br />"; echo "Pemangku Situs telah di pemberitahu"; error_log("Error: [$errno] $errstr",1, "someone@example.com","From: webmaster@example.com"); } //set error handler set_error_handler("customError",E_USER_WARNING); //trigger error $test=2; if ($test>1) { trigger_error("Nilai mesti 1 atau di bawah",E_USER_WARNING); } ?>
Output kode di atas seharusnya seperti ini:
Error: [512] Nilai mesti 1 atau di bawah Pemangku Situs telah di pemberitahu
E-mail yang diterima dari kode di atas seperti ini:
Error: [512] Nilai mesti 1 atau di bawah
Metode ini tidak sesuai untuk semua kesalahan. Kesalahan biasa seharusnya direkam di server melalui sistem perekam PHP baku.
- Halaman Sebelumnya E-mail Sekuriti PHP
- Halaman Berikutnya Exception PHP