[PHP] エラーページ処理方法(追加: ob_cleanとdie関数使用方法)


Study / PHP    作成日付 : 2020/01/29 03:00:00   修正日付 : 2020/01/29 03:00:00

こんにちは。明月です。


前述でPHPでエラーメッセージを処理する方法に関して説明したことがあります。

link - [PHP] Fatal及びNotice,、Warningメッセージ処理する方法


プログラムを開発する時にはこのエラーメッセージは重要です。エラーメッセージを見て間違ったことを修正するし、予想以外が発生することを確認しなければならないです。

でも、本番のサービスは違います。実際にインタネット上でエラーが発生することだと思えばログではエラーを残るけれども、画面上ではみえないようにしなければならないです。

一番、いい条件は初めからエラーが発生しないことがよいですが、全てのユーザの行動パターンを予測できないし作業者のミスや様々な条件で、エラーが必ず発生します。


なので、本番でエラーメッセージが見えることは実際にエラーメッセージでシステム情報や見えたらためな情報が見える可能性もあるし、ユーザがみて完成になれなかったことで見えるのでユーザによってサイトの信頼感が落ちることになります。

サイト内でエラーが発生するとエラーページに遷移しなければならないですが、その設定を「.htaccess」で設定可能です。

link - [PHP] 分散設定ファイル(.htaccess) 使用方法

link - HTTPステータスコード

(エラーコードをみながらみると理解しやすいです。)

Options -MultiViews
RewriteEngine On
Options -Indexes
RewriteRule ^(.*)$ index.php?htaccess=$1 [QSA,L]

# 404エラーが発生すると /Error?code=404に遷移する。
# RewriteRuleによってindex.php?htaccess=Error&code=404に変換する。
ErrorDocument 404 /Error?code=404
<?php
  // htaccessパラメータにERRORがあれば実行する。
  if(strtoupper($_GET["htaccess"]) == "ERROR") {
    // codeパラメータでエラーコードを取得する。
    $code = $_GET["code"];
    // codeパラメータがなければ$codeを404に設定する。
    if(trim($code) == ""){
      $code = "404";
    }
    // $code.phpつまり、404エラーの場合h404.phpをインクルードする。
    @include($_SERVER["DOCUMENT_ROOT"]."/".$code.".php");
    // 実行を止まる。
    die();
  }
?>
<!DOCTYPE html>
<html>
<head><title>title</title></head>
<body>
  index.php
</body>
</html>
<!DOCTYPE html>
<html>
<head><title>title</title></head>
<body>
  404 ERROR
</body>
</html>

上のエラーは我々がよく知っている「404」エラーに関して対応しました。404エラーはウェブページで当該なページが無い場合に発生することです。

先「.htaccess」をみれば「404」エラーが発生すると「/Error?code=404」にRewriteします。

また、RewriteRuleによって「index.php?htaccess=Error&code=404」に変換して遷移します。index.phpの中でエラーがある場合にエラーコードによってページを読み込んで画面に掲示します。


imageフォルダ中で実際に「test」ファイルは存在しません。


なので「404」エラーが発生します。

上の例はサーバ上でエラーが発生したことで、ソース内部でエラーが発生する時の処理です。

<?php
  // エラー関数呼出す。
  function response_error($code) {
    // response http statusを$codeによって呼出す。
    http_response_code($code);
    // 今まで、処理したhttp bodyバッファをクリアする。
    ob_clean();
    // $code.php、つまり404エラーの場合、404.phpを呼出す。
    @include($_SERVER["DOCUMENT_ROOT"]."/".$code.".php");
    // 実行を止まる。
    die();
  }
  // GETパラメータにエラーがあれば下記の条件が実行する。
  if(strtoupper($_GET["htaccess"]) == "ERROR"){
    // パラメータcodeを取得する。
    $code = $_GET["code"];
    // パラメータcodeがなければ、$codeデータを404に設定する。
    if(trim($code) == ""){
      $code = "404";
    }
    // $code.php、つまり404エラーの場合、404.phpを呼出す。
    @include($_SERVER["DOCUMENT_ROOT"]."/".$code.".php");
    // 実行を止まる。
    die();
  }
  // パラメータdataを取得する。
  $data = $_GET["data"];
  // データがなければ、
  if($data == null){
    // 404エラー関数を呼出す。
    response_error(404);
  }
?>
<!DOCTYPE html>
<html>
<head><title>title</title></head>
<body>
  <?=$data?>
</body>
</html>

上の例はパラメータがNULLかどうかでエラーが表示されるように実装しました。


上の結果はdataのパラメータに「1」というデータを入れるとhttp statusが200になりますね。200は正常です。

ウェブページも「1」という結果が表示されます。


上の結果はdataのパラメータにNULLをいれる(何も入力してない状況)と「404」エラーになります。

上のソースで「response_error」関数に404のデータを入力したから「404ERROR」ページが表示されます。


ここでPHP組込関数として「ob_clean」と「die」関数を使いました。

PHPは「」領域の以外にはHTMLマークで作成します。

そのHTMLマークはサーバからResponseする時バッファにStringタイプで格納していますよ。なので途中でincludeやphp計算式でバッファにbodyデータを書き込むと上から順番処理で格納されることです。

そのバッファをクリアする関数がob_cleanです。つまり、HTMLタグをたくさん書いてもPHPファイルの一番下に「ob_clean」を呼出すと空ページが表示されます。


「die」の場合は意味としてはエラーが発生するらしいな関数ですが、実は「die」が呼出したところで処理を止まって画面に表示するという意味です。

link - https://www.php.net/manual/en/function.ob-clean.php

link - https://www.php.net/die

最新投稿