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
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:
Pernyataan "die()" ringkas
Sejak Tentukan ralat dan pencetus ralat
Pelaporan ralat
Pengendalian ralat asas: gunakan fungsi die()
Contoh pertama menunjukkan skrip ringkas yang membuka fail teks:
<?php $file=fopen("welcome.txt","r"); ?>Jika fail itu tidak wujud, anda akan mendapat ralat seperti ini:
Warning: fopen(welcome.txt) [function.fopen]: failed to open stream: No such file or directory in /www/php/test/test.php on line 2Untuk 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 :
Berbanding dengan kod sebelumnya, kod di atas adalah lebih cekap kerana ia menggunakan mekanisme pengendalian ralat yang mudah Skrip telah ditamatkan selepas kesilapan.
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):
Tatabahasa
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 ialah pelbagai jenis ralat yang dikendalikan oleh pengendali ralat yang ditentukan pengguna:
值 | 常量 | 描述 |
---|---|---|
2 | E_WARNING | 非致命的 run-time 错误。不暂停脚本执行。 |
8 | E_NOTICE | run-time 通知。在脚本发现可能有错误时发生,但也可能在脚本正常运行时发生。 |
256 | E_USER_ERROR | 致命的用户生成的错误。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_ERROR。 |
512 | E_USER_WARNING | 非致命的用户生成的警告。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_WARNING。 |
1024 | E_USER_NOTICE | 用户生成的通知。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_NOTICE。 |
4096 | E_RECOVERABLE_ERROR | 可捕获的致命错误。类似 E_ERROR,但可被用户定义的处理程序捕获。(参见 set_error_handler()) |
8191 | E_ALL | 所有错误和警告。(在 PHP 5.4 中,E_STRICT 成为 E_ALL 的一部分) |
Sekarang, mari buat fungsi yang mengendalikan ralat:
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 mengaktifkan fungsi tersebut.
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 berhasrat untuk menggunakan pengendali ralat tersuai kami untuk semua ralat:
set_error_handler("customError");
Memandangkan kami mahu fungsi tersuai kami mengendalikan semua ralat, set_error_handler() hanya memerlukan satu hujah, 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);?> 以上代码的输出如下所示: Error: [8] Undefined variable: test
Ralat Pencetus
Pada titik dalam skrip di mana pengguna memasukkan data, 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 di atas kod adalah seperti berikut :
Notice: 变量值必须小于等于 1 in /www/test/php.php on line 5Anda boleh mencetuskan ralat di mana-mana dalam skrip Dengan menambah 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.
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:
Error: [512] 变量值必须小于等于 1 脚本结束Memandangkan kita telah mempelajari cara mencipta ralat kita sendiri dan cara mencetuskannya, mari kita lihat 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 terbaik untuk mendapatkan pemberitahuan 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, "someone@example.com","From: webmaster@example.com"); } // 设置错误处理函数 set_error_handler("customError",E_USER_WARNING); // 触发错误 $test=2; if ($test>1) { trigger_error("变量值必须小于等于 1",E_USER_WARNING); } ?>Output kod di atas kelihatan seperti ini:
Error: [512] 变量值必须小于等于 1已通知网站管理员 接收自以上代码的邮件如下所示: Error: [512] 变量值必须小于等于 1Kaedah ini tidak sesuai untuk semua ralat. Ralat umum harus dilog pada pelayan menggunakan sistem pengelogan PHP lalai.