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

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 kepada anda:

1 Pernyataan "die()" yang mudah

2 3. Pelaporan ralat

Pengendalian ralat asas: gunakan fungsi die() Contoh pertama menunjukkan skrip Mudah terbuka untuk fail teks :

<?php
   $file=fopen("welcome.txt","r");
?>

Jika fail tidak wujud, anda akan mendapat ralat seperti ini:

Amaran: fopen(welcome.txt) [function.fopen]: gagal membuka strim :

Tiada fail atau direktori sedemikian dalam /www/php/test/test.php pada baris 2


Untuk mengelakkan pengguna mendapat mesej ralat seperti di atas, kami menyemak jika fail 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 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):

Sintaks

fungsi_ralat(peringkat_ralat, mesej_ralat, fail_ralat, baris_ralat, konteks_ralat)

Parameter                                              🎜>

error_level             Diperlukan. Menentukan tahap pelaporan ralat untuk ralat yang ditentukan pengguna. Mesti nombor. Lihat jadual di bawah: Tahap pelaporan ralat.

error_message Diperlukan. Menentukan mesej ralat untuk ralat yang ditentukan pengguna.

fail_ralat Pilihan. Menentukan nama fail di mana ralat berlaku.

error_line                   Pilihan. Menentukan nombor baris tempat ralat berlaku.

error_context Pilihan. Menentukan tatasusunan yang mengandungi setiap pembolehubah yang digunakan apabila ralat berlaku dan nilainya.

Tahap pelaporan ralat

Tahap pelaporan ralat ini ialah pelbagai jenis ralat yang dikendalikan oleh pengendali ralat yang ditentukan pengguna:

Nilai                                                                                                                                                                                                                                                                                      Jangan jeda pelaksanaan skrip. 8 E_NOTICE pemberitahuan masa jalan. Berlaku apabila skrip menemui kemungkinan ralat, tetapi juga boleh berlaku apabila skrip berjalan seperti biasa.

256 E_USER_ERROR Ralat yang dijana pengguna maut. 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().
1024 E_USER_NOTICE Pemberitahuan yang dijana pengguna. Ini serupa dengan E_NOTICE yang ditetapkan oleh pengaturcara menggunakan fungsi PHP trigger_error().

4096 E_RECOVERABLE_ERROR Ralat maut boleh terperangkap. Seperti E_ERROR, tetapi boleh ditangkap oleh pengendali yang ditentukan pengguna. (Lihat set_error_handler())

8191 E_ALL Semua ralat dan amaran. (Dalam PHP 5.4, E_STRICT menjadi sebahagian daripada E_ALL)

Dalam jenis di atas:

1 Ralat adalah yang paling serius dan mesti diselesaikan. Jika tidak, program tidak boleh terus melaksanakan

2. amaran juga sangat penting. Tong juga mesti diselesaikan. Jika ia jelas dan disengajakan, anda tidak perlu berurusan dengannya

3. Perhatikan Anda tidak perlu berurusan dengannya. Tetapi dalam sesetengah syarikat, piawaian projek sangat tinggi. Ia juga mesti diselesaikan dalam projek dengan keperluan standard yang tinggi. Kerana notis akan menjejaskan kecekapan pelaksanaan PHP. Biasanya berlaku apabila fungsi tidak ditakrifkan, dsb.

4 Ralat hurai merujuk kepada ralat sintaks dan kesilapan taip, yang mesti diselesaikan

5 🎜> Sekarang, mari buat fungsi yang mengendalikan ralat:

fungsi customError($errno, $errstr)
{
echo "<b>Error:</b> [$errno] $errstr<br>";
echo "Tamat skrip";
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 boleh 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


mencetuskan ralat

dalam Lokasi dalam skrip tempat pengguna memasukkan data, 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/php.php pada baris 5

Anda boleh Di Mana-mana ralat dicetuskan, dengan menambahkan parameter kedua anda boleh menentukan tahap ralat yang dicetuskan.

Jenis ralat yang mungkin:

1. E_USER_ERROR - Ralat masa jalan yang dijana oleh pengguna. Ralat tidak dapat dipulihkan. Pelaksanaan skrip terganggu.

2. E_USER_WARNING - Amaran masa jalan yang dijana pengguna yang tidak membawa maut. Pelaksanaan skrip tidak terganggu.

3. 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 boleh ubah Mesti kurang daripada atau sama dengan 1

Skrip Tamat

Sekarang kita telah belajar cara mencipta ralat kita sendiri dan cara mencetuskannya, mari kita kaji rekod ralat.

Rekod ralat

Berikut ialah item konfigurasi berkaitan yang perlu digunakan dalam php.ini. Kedua-dua item konfigurasi ini ialah:

Parameter                                                                                                                                                …                                                                                                                                                                                                                                                                                 log_errors_max_len                                         log_errors_max_len                                                                                      Tentukan laluan di mana log ralat direkodkan Penjelasan: Log_errors and log_errors_max_len dalam jadual sangat mudah difahami.
Dan error_log menentukan laluan di mana ralat akan disimpan. Syslog dalam item konfigurasi mungkin agak sukar untuk difahami. syslog merujuk kepada rakaman sistem. Sistem Windows berada dalam pengumpul log komputer. Linux lalai kepada: /etc/syslog.conf

Secara lalai, mengikut konfigurasi error_log dalam php.ini, PHP menghantar rekod ralat ke sistem rakaman pelayan atau fail. Dengan menggunakan fungsi error_log(), anda boleh menghantar rekod ralat ke fail tertentu atau destinasi jauh. Menge-melkan mesej ralat kepada diri sendiri ialah cara terbaik untuk mendapatkan pemberitahuan tentang ralat yang ditentukan.

Hantar mesej ralat melalui E-Mel

Dalam contoh di bawah, jika ralat tertentu berlaku, kami akan menghantar mesej ralat dengan e-mel , dan tamatkan 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);
 }
?>

Keluaran kod di atas adalah seperti berikut:

Ralat: [512] Nilai pembolehubah mestilah kurang daripada atau sama dengan 1

Sudah Maklumkan kepada pentadbir laman web

E-mel yang diterima daripada kod di atas 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.


Meneruskan pembelajaran
||
<?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); } ?>
  • Cadangan kursus
  • Muat turun perisian kursus