PHPエラー処理

PHP では、デフォルトのエラー処理は簡単です。ファイル名、行番号、およびエラーを説明するメッセージを含むエラー メッセージがブラウザに送信されます。


PHP エラー処理

エラー処理は、スクリプトや Web アプリケーションを作成する際の重要な部分です。コードにエラー検出コーディングが欠けていると、プログラムは専門的ではないように見え、セキュリティ リスクへの扉が開かれてしまいます。

このチュートリアルでは、PHP の最も重要なエラー検出方法のいくつかについて説明します。

さまざまなエラー処理方法について説明します:

・単純な「die()」ステートメント

・カスタムエラーとエラートリガー

・エラーレポート


基本エラー処理: die() 関数の使用

最初の例は、テキスト ファイルを開くための簡単なスクリプトを示しています:

<?php
$open=fopen('error.txt','r');
echo $open;
?>

ファイルが存在しない場合、次のようなエラーが表示されます。これ:

警告: fopen(error.txt) [function.fopen]: ストリームを開けませんでした:
/www/php/test/test.php の 2 行目にそのようなファイルまたはディレクトリはありません

回避するにはユーザーが上記のようなエラー メッセージを受け取る場合、ファイルにアクセスする前にファイルが存在するかどうかを確認します:

<?php
header("Content-type:text/html;charset=utf-8");
if(!file_exists('error.txt')){
    die("文件不存在");
}else{
    $file=fopen('error.txt','r');
}
?>

さて、ファイルが存在しない場合は、次のようなエラー メッセージが表示されます:

ファイルが存在しません

上記のコードは、単純なエラー処理メカニズムを使用してエラー後にスクリプトを終了するため、前のコードよりも効率的です。

ただし、単にスクリプトを終了することが常に適切なアプローチであるとは限りません。エラーを処理するための代替 PHP 関数を調べてみましょう。


カスタム エラー ハンドラーを作成する

カスタム エラー ハンドラーの作成は非常に簡単です。 PHP でエラーが発生したときに呼び出せる専用の関数を作成しただけです。

関数は少なくとも 2 つのパラメータ (エラー レベルとエラー メッセージ) を処理できる必要がありますが、最大 5 つのパラメータ (オプション: ファイル、行番号、エラー コンテキスト) を受け入れることができます。 、エラーメッセージ、エラーファイル、エラーライン、エラーコンテキスト)


必須。ユーザー定義エラーのエラー報告レベルを指定します。数値である必要があります。以下の表を参照してください: エラー報告レベル。 error_message必須。ユーザー定義エラーのエラー メッセージを指定します。
パラメータ 説明


error_level

error_fileオプション。エラーが発生したファイル名を指定します。 error_line オプション。エラーが発生した行番号を指定します。 error_context オプション。エラーが発生したときに使用されていた各変数とその値を含む配列を指定します。

エラーレポートレベル

これらのエラーレポートレベルは、さまざまな種類のエラーを処理するユーザー定義のエラーハンドラーです:

致命的ではない実行時エラー。スクリプトの実行を一時停止しないでください。 N _ 8e_noticeE_USER_ERRORE_USER_WARNING 致命的ではないユーザー生成の警告。これは、プログラマが PHP 関数 trigger_error() を使用して設定する E_WARNING に似ています。
定数 説明 2E_WARNING

実行時通知。スクリプトがエラーの可能性を検出したときに発生しますが、スクリプトが正常に実行されているときにも発生する可能性があります。

256

致命的なユーザー生成エラー。これは、プログラマが PHP 関数trigger_error()を使用して設定する E_ERROR に似ています。

512


1024


E_USER_NOTICE

ユーザーが生成した通知。これは、プログラマが PHP 関数trigger_error() を使用して設定する E_NOTICE に似ています。

4096



E_RECOVERABLE_ERROR

キャッチ可能な致命的なエラー。 E_ERROR と似ていますが、ユーザー定義のハンドラーによってキャッチされる可能性があります。 (set_error_handler())を参照してください(PHP 5.4 では、E_STRICT は E_ALL の一部になります)

さて、エラーを処理する関数を作成しましょう:

<?php
header("Content-type:text/html;charset=utf-8");
function customError($errno, $errstr)
{
    echo "<b>Error:</b> [$errno] $errstr<br>";
    echo "脚本结束";
    die();
}
?>

上記のコードは、単純なエラー処理関数です。トリガーされると、エラー レベルとエラー メッセージが取得されます。次に、エラー レベルとメッセージを出力し、スクリプトを終了します。

エラー処理関数を作成したので、関数をいつ起動するかを決定する必要があります。


エラーハンドラーを設定する

PHPのデフォルトのエラーハンドラーは、組み込みエラーハンドラーです。スクリプトの実行時に、上記の関数をデフォルトのエラー ハンドラーに変換します。

エラー ハンドラーは、特定のエラーにのみ適用されるように変更できるため、スクリプトはさまざまな方法でさまざまなエラーを処理できます。ただし、この場合、すべてのエラーに対してカスタム エラー ハンドラーを使用します:

set_error_handler("customError");

カスタム関数ですべてのエラーを処理したいため、set_error_handler() に必要なのは1 つのパラメーターに、2 番目のパラメーターを追加してエラー レベルを指定できます


上記で学んだ知識を組み合わせて、存在しない変数を出力してこのエラー ハンドラーをテストしてみます:

<?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);
?>

プログラムの実行結果:

エラー: [8] 未定義の変数: test

実行結果は、エラーレベルが 8 であることを示し、エラーメッセージは次のとおりです: 存在しない変数


エラーのトリガー

ユーザーがデータを入力するスクリプトの時点で、ユーザーの入力が無効な場合にエラーをトリガーすると便利です。 PHP では、このタスクは trigger_error() 関数によって実行されます。

この例では、「test」変数が「1」より大きい場合、エラーが発生します:

<?php
header("Content-type:text/html;charset=utf-8");
$test=2;
if ($test>1)
{
    trigger_error("变量值必须小于等于 1");
}
?>

プログラムの実行結果:

注意: 変数の値はそれより小さくなければなりませんD :WWWAdvancedtutorialerrorerror_1.php の 6 行目以上 1


2 番目のパラメーターを追加すると、トリガーされるエラー レベルを指定できます。

考えられるエラーの種類:

· E_USER_ERROR - ユーザーが生成した致命的な実行時エラー。エラーは回復できません。スクリプトの実行が中断されました。

· E_USER_WARNING - 致命的ではないユーザー生成の実行時警告。スクリプトの実行は中断されません。

· E_USER_NOTICE - デフォルト。ユーザーが生成した実行時通知。スクリプトがエラーの可能性を検出したときに発生しますが、スクリプトが正常に実行されているときにも発生する可能性があります。


この例では、「test」変数が「1」より大きい場合、E_USER_WARNING エラーが発生します。 E_USER_WARNING が発生した場合、カスタム エラー ハンドラーを使用してスクリプトを終了します:

<?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);
}
?>

プログラム実行結果:

エラー: [512] 変数値は 1 以下である必要があります
スクリプト終了

実行中結果 エラーレベルの値が512であることを教えてください。エラーメッセージは、trigger_error関数で設定したプロンプトメッセージになります


エラーログ

一部の企業では、特別なログ収集がありますシステム。ログ収集システムは、エラー、警告、プロンプトをバックグラウンドで収集するのに役立ちます。

専用のログ収集システムを持たず、サーバーから実行ログをファイル経由で収集している企業もあります。

その中には、PHP エラー、警告を受信する必要があります。

次に、ユーザーに表示が許可されておらず、エラー報告レベルが設定されている場合、ログ システムにエラーを収集するにはどうすればよいでしょうか?という疑問が生じます。

php.ini で使用する必要がある関連する設定項目は次のとおりです。これら 2 つの設定項目は次のとおりです:

エラーメッセージの種類 説明
0 デフォルトの error_log の指定場所
1 指定したメールの場所に送信します
3指定したファイルの場所に送信します

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

インスタンス

以下の例では、特定のエラーが発生した場合、エラーメッセージを含む電子メールを送信し、スクリプトを終了します。

プログラムの実行結果:

エラー: [512] 値は 1 以下である必要があります
ウェブマスターに通知されました


上記のコードから受信したメールは次のようなものです:

エラー: [512] 値は 1 以下である必要があります


このメソッドはすべてのエラーに適しているわけではありません。一般的なエラーは、デフォルトの PHP ログ システムを使用してサーバーに記録される必要があります。

注:

error_log でのメールの送信は初心者にとって馴染みのないものであるため、ある程度の知識を習得する必要はありません。


error_reporting レポートエラータイプ

error_reporting は、エラーレポートを指します。 php.iniにもそのようなパラメータがあります。このパラメータ。 PHP エンジンが記録、レポート、表示するエラーのタイプを決定します。

1. php.ini の error_reporting パラメーター。 error_reporting パラメータが 0 に設定されている場合。 PHP エンジン全体のエラーは表示、出力、または記録されません。次の章で説明するログには記録されません。

すべてのエラーを表示したい場合は、次のように記述できます:

error_reporting = E_ALL

プロンプトを除外してすべてのエラーを表示したい場合は、このパラメータを次のように記述できます:

error_reporting = E_ALL & ~ E_NOTICE

すべてのエラーを表示しますが、ヒント、互換性、将来の互換性は除きます。次のように記述できます:

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

2. 場合によっては、php.ini ファイルを操作する権限がない場合があります。 error_reporting を制御したいのですが、どうすればよいでしょうか?

xxxx.php ファイルの実行の開始時に、error_reporting() 関数を使用して目標を達成できます。

<?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);
 }
 ?>

上記のコードを試してみたり、意図的に間違ったコードを書いて試してみたりすることもできます。指定されたエラーが現在のファイルに表示されるかどうか。

[知識ポイントを拡張して理解する]:

@

記号は以前に学習した、エラーが表示されない単一行です。@ 記号は使用しないか、控えめに使用してください。


インスタンス

この PHP コードを使用して存在しないファイルを読み取り、実装プロセスを示してみましょう:

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



学び続ける
||
<?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); ?>
  • おすすめコース
  • コースウェアのダウンロード
現時点ではコースウェアはダウンロードできません。現在スタッフが整理中です。今後もこのコースにもっと注目してください〜