PHPにおけるデフォルトのエラー処理は非常に簡単です。 ファイル名、行番号、とエラーを説明するメッセージを持つエラーメッセージがブラウザに送信されます。
スクリプトやWebアプリケーションを作成する場合、エラー処理は重要な部分です。 エラーをチェックするコードがないコードは、プロが作ったものとは見えないことと、セキュリティ・リスクにさらされる可能性もあります。
このチュートリアルには、PHPで最も一般的なエラーチェックメソッドがいくつか掲載しています。
さまざまなエラー処理方法を示します:
最初の例は、テキストファイルを開く簡単なスクリプトです:
<?php
$file=fopen("welcome.txt","r");
?>
ファイルが存在しない場合、次のようなエラーが発生します:
Warning: fopen(welcome.txt) [function.fopen]: failed to open stream:
No such file or directory in C:\webfolder\test.php on line 2
上のようなエラーメッセージが表示されないように、ファイルにアクセスする前にファイルが存在するかどうかをテストします:
<?php
if(!file_exists("welcome.txt")) {
die("File not found");
}
else {
$file=fopen("welcome.txt","r");
}
?>
これにより、ファイルが存在しない場合は、次のようなエラー表示になります:
File not found
上のコードは、単純なエラー処理メカニズムを使用し、エラーの後にスクリプトを停止するため、前のコードよりも効率的です。
しかし、単にスクリプトを停止するだけでは必ずしも正しい方法ではありません。エラー処理のための代替PHP関数を見てみましょう。
カスタムエラーハンドラを作成するのは簡単です。 PHPでエラーが発生したときに呼び出す、特殊な関数を作成するだけです。
この関数は、最低2つのパラメータ(エラーレベルとエラーメッセージ)を処理する必要がありますが、 最大5つのパラメータ(オプションでファイル、行番号、エラーコンテキスト)を受け取ることができます:
error_function(error_level,error_message,
error_file,error_line,error_context)
パラメータ | 説明 |
---|---|
error_level | 必須。ユーザ定義エラーのエラー報告レベルを指定します。値は数値でなければなりません。 可能なエラー報告レベルについては、以下の表を参照してください |
error_message | 必須。ユーザ定義エラーのエラー・メッセージを指定します |
error_file | 任意。エラーが発生したファイル名を指定します |
error_line | 任意。エラーが発生した行番号を指定します |
error_context | 任意。エラーが発生したときに使用しているすべての変数とその値を含む配列を指定します |
このエラー報告レベルは、ユーザ定義のエラーハンドラで使用できる様々な種類のエラーです:
値 | コンスタント | 説明 |
---|---|---|
2 | E_WARNING | 致命的でないランタイムエラー。実行中のスクリプトは停止しません |
8 | E_NOTICE | 実行時の通知。スクリプトはエラーである可能性があるものを見つけましたが、スクリプトが正常に実行しているときにも起きます |
256 | E_USER_ERROR | 致命的なユーザ生成エラー。これは、PHP関数trigger_error()を使用してプログラマが設定したE_ERRORに類似しています |
512 | E_USER_WARNING | 致命的でないユーザ生成の警告。これは、 |
1024 | E_USER_NOTICE | ユーザ生成の通知。これは、PHP関数trigger_error()を使用してプログラマが設定したE_NOTICEに類似しています |
4096 | E_RECOVERABLE_ERROR | 捕捉可能な致命的エラー。これはE_ERRORに似ていますが、ユーザ定義処理で捕捉できます(set_error_handler()も参照してください) |
8191 | E_ALL | すべてのエラーと警告(E_STRICTはPHP 5.4でE_ALLの一部になりました) |
次に、エラーを処理する関数を作成しましょう:
function customError($errno, $errstr) {
echo "<b>Error:</b> [$errno] $errstr<br>";
echo "Ending Script";
die();
}
上のコードは単純なエラー処理関数です。トリガされると、エラーレベルとエラーメッセージを取得した後、 エラーレベルとメッセージを出力してスクリプトを終了します。
エラー処理関数を作成したので、いつトリガするのかを決定する必要があります。
PHPのデフォルトのエラーハンドラは、組み込みのエラーハンドラです。実行中のスクリプトのデフォルト・エラーハンドラ上に関数を作成します。
いくつかのエラーのみに適用するために、エラーハンドラを変更することが可能です。つまり、スクリプトは様々な方法で異なるエラーを処理できます。 しかし、この例では、すべてのエラーに対してカスタムエラーハンドラを使用します:
set_error_handler("customError");
カスタム関数ですべてのエラーを処理したいので、set_error_handler()は1つのパラメータしか必要ありませんが、 2つ目のパラメータを追加してエラーレベルを指定することができます。
存在しない変数を出力しようとしてエラーハンドラをテストします:
<?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);
?>
上のコードの出力は、次のようになります:
Error: [8] Undefined variable: test
これは、ユーザがデータを入力できるスクリプトで、不正な入力が発生したときにエラーをトリガするのに便利です。 PHPでは、これをtrigger_error()関数で行います。
この例は、 "test"変数が "1"より大きい場合にエラーが発生します:
<?php
$test=2;
if ($test>=1)
{
trigger_error("Value must be 1 or below");
}
?>
上記のコードの出力は、次のようになります:
Notice: Value must be 1 or below
in C:\webfolder\test.php on line 6
スクリプト内の、任意の場所でエラーを発生させることができます。 また、2番目のパラメータを追加することで、どのレベルのエラーをトリガするかを指定できます。
可能なエラーの種類:
この例では、"test"変数が "1"より大きい場合にE_USER_WARNINGが発生します。 E_USER_WARNINGが発生した場合は、カスタムエラーハンドラを使用してスクリプトを終了します:
<?php
//error handler function
function customError($errno, $errstr) {
echo "<b>Error:</b> [$errno] $errstr<br>";
echo "Ending Script";
die();
}
//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);
}
?>
上記のコードの出力は、次のようになります:
Error: [512] Value must be 1 or below
Ending Script
ここでは、独自のエラーを作成する方法と、エラーをトリガする方法を学んだので、次はエラーログを見てみましょう。
デフォルトでは、php.iniファイルのerror_logがどのように設定されているかに応じて、 PHPはサーバのログシステムまたはファイルにエラーログを送信します。 error_log()関数を使用することで、指定のファイルまたはリモートの宛先にエラーログを送信することができます。
メールでエラーメッセージを自分宛に送信すると、指定のエラー通知を取得するする良い方法になります。
下の例では、指定のエラーが発生した場合、エラーメッセージ付きのメールを送信して、スクリプトを終了します:
<?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);
}
?>
上のコードの出力は、次のようになります:
Error: [512] Value must be 1 or below
Webmaster has been notified
上のコードから受信したメールは次のようになります:
Error: [512] Value must be 1 or below
これは、すべてのエラーに使用するべきではありません。通常のエラーは、デフォルトのPHPロギングシステムを使用して、 サーバに記録するべきです。