[PHP] エラーページ処理方法(追加: ob_cleanとdie関数使用方法)
こんにちは。明月です。
前述で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
- [CakePHP] MVCフレームワークのCakeをインストールする方法2020/02/07 03:00:02
- [PHP] 自動require及びincludeをする方法(spl_autoload_register)2020/02/05 03:00:00
- [PHP] 匿名関数(ラムダ式)とクロージャ(closure)2020/02/04 03:00:00
- [PHP] PHPのコーディング領域とデザイン領域を分離するテンプレートライブラリ Smarty2020/02/02 03:00:00
- [PHP] Reflection - Variable編2020/02/01 03:00:00
- [PHP] Reflection - Method編2020/01/31 03:00:00
- [PHP] Reflection - Class編2020/01/30 03:00:00
- [PHP] エラーページ処理方法(追加: ob_cleanとdie関数使用方法)2020/01/29 03:00:00
- [PHP] 分散設定ファイル(.htaccess) 使用方法2020/01/28 03:00:00
- [PHP] データベース(mariaDB)を連結して使う方法2020/01/24 03:00:00
- [PHP] IOに関して2020/01/23 03:00:00
- [PHP] requireとinclude、そして「@」の使用方法2020/01/22 03:00:00
- [PHP] Fatal及びNotice,、Warningメッセージ処理する方法2020/01/19 03:00:00
- [PHP] xDebug設定する方法2020/01/18 03:00:00
- [PHP] $_SERVER, $GLOBALS, $_GET, $_POST, $_REQUEST, $_COOKIE, $_SESSION, $_FILES, $_ENV(getenv())2020/01/17 03:00:00
- check2024/04/10 19:03:53
- [Java] 64.Spring bootとReactを連結する方法(Buildする方法)2022/03/25 21:02:18
- [Javascript] Node.jsをインストールしてReactを使う方法2022/03/23 18:01:34
- [Java] 63. Spring bootでcronスケジューラとComponentアノテーション2022/03/16 18:57:30
- [Java] 62. Spring bootでWeb-Filterを設定する方法(Spring Security)2022/03/15 22:16:37
- [Java] JWT(Json Web Token)を発行、確認する方法2022/03/14 19:12:58
- [Java] 61. Spring bootでRedisデータベースを利用してセッションクラスタリング設定する方法2022/03/01 18:20:52
- [Java] 60. Spring bootでApacheの連結とロードバランシングを設定する方法2022/02/28 18:45:48
- [Java] 59. Spring bootのJPAでEntityManagerを使い方2022/02/25 18:27:48
- [Java] 58. EclipseでSpring bootのJPAを設定する方法2022/02/23 18:11:10
- [Java] 57. EclipseでSpring bootを設定する方法2022/02/22 19:04:49
- [Python] Redisデータベースに接続して使い方2022/02/21 18:23:49
- [Java] Redisデータベースを接続して使い方(Jedisライブラリ)2022/02/16 18:13:17
- [C#] Redisのデータベースを接続して使い方2022/02/15 18:46:09
- [CentOS] Redisデータベースをインストールする方法とコマンドを使い方2022/02/14 18:33:07