PHP エラー処理


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


PHP エラー処理

スクリプトやWebアプリケーションを作成する際、エラー処理は重要な部分です。コードにエラー検出のコーディングが欠けていると、プログラムは非常にプロフェッショナルではないように見え、セキュリティリスクへの扉を開くことにもなります。

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

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

  • シンプルな "die()" ステートメント
  • カスタムエラーとエラートリガー
  • エラーレポート

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

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

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

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

Warning: fopen(welcome.txt) [function.fopen]: failed to open stream:
No such file or directory in /www/サンプル/test/test.php on line 2

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

<?php
if(!file_exists("welcome.txt"))
{
    die("文件不存在");
}
else
{
    $file=fopen("welcome.txt","r");
}
?>

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

ファイルが存在しません。

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

ただし、単にスクリプトを終了するだけでは必ずしも適切な方法ではありません。エラーを処理するための代替の 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 非致命的なユーザー生成警告。これは、プログラマーが PHP 関数 trigger_error() を使用して設定する E_WARNING に似ています。
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 の一部になりました)

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

function customError($errno, $errstr)
{
    echo "<b>Error:</b> [$errno] $errstr<br>";
    echo "脚本结束";
    die();
}

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

これでエラー処理関数を作成しました。次に、いつその関数をトリガーするかを決定する必要があります。


エラーハンドラの設定

PHP のデフォルトのエラーハンドラは、組み込みのエラーハンドラです。上記の関数を、スクリプト実行中のデフォルトのエラーハンドラとして設定します。

エラーハンドラを変更して特定のエラーにのみ適用し、スクリプトがエラーごとに異なる方法で処理できるようにすることができます。ただし、この例では、すべてのエラーに対してカスタムエラーハンドラを使用します。

set_error_handler("customError");

カスタム関数で全てのエラーを処理したいため、set_error_handler() は1つの引数のみ必要です。2番目の引数を追加してエラーレベルを指定することもできます。

例

存在しない変数を出力しようとして、このエラーハンドラをテストします:

<?php
// 错误处理函数
function customError($errno, $errstr)
{
    echo "<b>Error:</b> [$errno] $errstr";
}

// 设置错误处理函数
set_error_handler("customError");

// 触发错误
echo($test);
?>

上記のコードの出力は次のとおりです:

Error: [8] Undefined variable: test


エラーのトリガー

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

例

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

<?php
$test=2;
if ($test>1)
{
    trigger_error("变量值必须小于等于 1");
}
?>

上記のコードの出力は次のとおりです:

Notice: 变量值必须小于等于 1
in /www/test/サンプル.php on line 5

スクリプト内の任意の場所でエラーをトリガーできます。追加された2番目の引数により、トリガーするエラーの種類を指定できます。

可能なエラータイプ:

  • E_USER_ERROR - 致命的なユーザー生成ランタイムエラー。エラーから回復できません。スクリプトの実行が中断されます。
  • E_USER_WARNING - 非致命的なユーザー生成ランタイム警告。スクリプトの実行は中断されません。
  • E_USER_NOTICE - デフォルト。ユーザー生成のランタイム通知。スクリプトが潜在的なエラーを発見したときに発生しますが、スクリプトが正常に実行されているときにも発生する可能性があります。

例

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

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

上記のコードの出力は次のとおりです:

Error: [512] 变量值必须小于等于 1
脚本结束

ここまでで、独自のエラーを作成する方法と、それらをトリガーする方法を学びました。次に、エラーログについて調べましょう。


エラーログ

デフォルトでは、php.ini の error_log 設定に従って、PHP はサーバーのログシステムまたはファイルにエラーログを送信します。error_log() 関数を使用すると、指定したファイルまたはリモートの宛先にエラーログを送信できます。

電子メールで自分自身にエラーメッセージを送信することは、特定のエラーの通知を受け取る良い方法です。

Eメールでエラーメッセージを送信する

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

<?php
// 错误处理函数
function customError($errno, $errstr)
{
    echo "<b>Error:</b> [$errno] $errstr<br>";
    echo "已通知网站管理员";
    error_log("Error: [$errno] $errstr",1,
    "[email protected]","From: [email protected]");
}

// 设置错误处理函数
set_error_handler("customError",E_USER_WARNING);

// 触发错误
$test=2;
if ($test>1)
{
    trigger_error("变量值必须小于等于 1",E_USER_WARNING);
}
?>

上記のコードの出力は次のとおりです:

Error: [512] 变量值必须小于等于 1
已通知网站管理员

上記のコードから受信したメールは次のとおりです:

Error: [512] 变量值必须小于等于 1

この方法はすべてのエラーに適しているわけではありません。通常のエラーは、デフォルトの PHP ログシステムを使用してサーバー上に記録する必要があります。

その他の拡張機能