PHP エラー処理

❮ 前章へ 次章へ ❯

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


PHPエラー処理

スクリプトやWebアプリケーションを作成する場合、エラー処理は重要な部分です。 エラーをチェックするコードがないコードは、プロが作ったものとは見えないことと、セキュリティ・リスクにさらされる可能性もあります。

このチュートリアルには、PHPで最も一般的なエラーチェックメソッドがいくつか掲載しています。

さまざまなエラー処理方法を示します:


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

最初の例は、テキストファイルを開く簡単なスクリプトです:

<?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ロギングシステムを使用して、 サーバに記録するべきです。


❮ 前章へ 次章へ ❯