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

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:

           常量    描述
    2E_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。
nilai<🎜><🎜>
<🎜>Constant<🎜>< 🎜> <🎜> Penerangan<🎜><🎜>
E_WARNINGLarian 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().

     

    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 的一部分)
     <🎜><🎜>    1024<🎜><🎜>< /td>
<🎜>
<🎜> <🎜>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:

< / tr>< tr >< / jadual>

Contoh

<?php
//无法连接到数据库服务器,直接记录到php.ini 中的error_log指定位置
error_log("无法连接到数据库服务器服务器");
//可以发送邮件,但是php.ini必须配置过邮件系统
error_log('可以用邮件报告错误,让运维人员半夜起床干活',1 ,'liwenkai@phpxy.com');
//记录在指定的位置
error_log("我是一个错误哟", 3, "d:/test/my-errors.log");
?>

Contoh

Dalam contoh di bawah, jika ralat tertentu berlaku, kami akan menghantar e-mel dengan mesej ralat dan menamatkan skrip:

<?php
 //error handler function
 function customError($errno, $errstr)
 {
     echo "<b>Error:</b> [$errno] $errstr<br />";
     echo "Webmaster has been notified";
     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("Value must be 1 or below",E_USER_WARNING);
 }
 ?>

Hasil berjalan program :

Ralat: [512] Nilai mestilah 1 atau ke bawah
Juruweb telah dimaklumkan

E-mel yang diterima daripada kod di atas kelihatan seperti ini:

Ralat: [512] Nilai mestilah 1 atau lebih rendah

Kaedah ini tidak sesuai untuk semua kesilapan. Ralat umum harus dilog pada pelayan menggunakan sistem pengelogan PHP lalai.

Nota: Menghantar e-mel dalam error_log mungkin tidak biasa bagi pemula, jadi anda tidak perlu menguasai sedikit pengetahuan.


error_reporting reporting type erroring

error_reporting merujuk kepada Laporan ralat. Terdapat juga parameter sedemikian dalam php.ini. parameter ini. Menentukan jenis ralat yang direkodkan, laporan dan paparan enjin PHP.

1. Tetapkan parameter error_reporting dalam php.ini. Jika parameter error_reporting ditetapkan kepada 0. Ralat dalam keseluruhan enjin PHP tidak akan dipaparkan, dikeluarkan atau direkodkan. Ia tidak akan direkodkan dalam pembalakan yang akan dibincangkan dalam bab seterusnya.

Jika kita ingin menunjukkan semua ralat kita boleh menulis:

error_reporting = E_ALL

Ingin menunjukkan semua ralat tetapi kecualikan Petua, anda boleh menulis parameter ini sebagai:

error_reporting = E_ALL & ~ E_NOTICE

Tunjukkan semua ralat, tetapi kecualikan gesaan, keserasian dan Keserasian masa hadapan. Boleh ditulis sebagai:

error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED


2. Dalam sesetengah kes, kami tidak mempunyai kebenaran untuk mengendalikan fail php.ini, tetapi apakah yang perlu kami lakukan jika kami mahu mengawal error_reporting?

Pada permulaan fail xxxx.php yang dijalankan, kita boleh menggunakan fungsi error_reporting() untuk mencapai matlamat.

<?php
//关闭了所有的错误显示
error_reporting(0);
//显示所有错误
//error_reporting(E_ALL);
//显示所有错误,但不显示提示
//error_reporting(E_ALL & ~ E_NOTICE);
?>

Anda boleh mencuba kod di atas dan cuba menulis kod yang salah dengan sengaja. Sama ada ralat yang ditentukan akan dipaparkan dalam fail semasa.

[Kembangkan dan fahami perkara pengetahuan]:

@ Simbol ialah satu baris yang telah kita pelajari sebelum ini yang tidak memaparkan ralat , sila jangan gunakan atau kurang gunakan simbol @.


Instance

Mari baca fail yang tidak wujud dan tunjukkan proses pelaksanaan dengan kod php ini:

<?php
//读取一个不存在的adsaf.txt文件,用@符抑制错误
@$fp = fopen('adsaf.txt','r');
?>
    @符效率较低,它在php内核中的实现过程是:
<?php
//关闭错误
error_reporting(0);
//读取一个不存在的文件,显示错误
//显示错误
error_reporting(E_ALL & ~ E_NOTICE);
?>



Meneruskan pembelajaran
||
<?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); ?>
  • Cadangan kursus
  • Muat turun perisian kursus
    错误消息类型      说明
     0发送至默认的error_log指定位置
     1 发送到指定的邮件位置
     3发送至指定的文件位置
<🎜> Jenis mesej ralat<🎜><🎜>
<🎜><🎜> Penerangan<🎜><🎜>
0 Hantar ke lokasi yang ditentukan log_ralat lalai
1 Hantar ke lokasi e-mel yang ditentukan
3Hantar ke lokasi fail yang ditentukan