【PHP8.x】http_response_code関数の使い方

作成日: 更新日:

http_response_code関数は、HTTPレスポンスステータスコードを取得または設定する関数です。Webサーバーがクライアント(Webブラウザなど)に送信するレスポンスのステータスを表す数値コードを操作するために使用されます。この関数を使うことで、PHPスクリプトからHTTPレスポンスヘッダーのステータスコードを動的に変更できます。

引数を指定せずにこの関数を呼び出すと、現在のリクエストにおけるHTTPレスポンスステータスコードを返します。ステータスコードが明示的に設定されていない場合、デフォルト値(通常は200 OK)が返されます。

引数に整数値を指定してこの関数を呼び出すと、HTTPレスポンスヘッダーのステータスコードが指定された値に設定されます。例えば、http_response_code(404)と記述すると、ステータスコードは404 Not Foundに設定されます。この場合、関数は成功時にtrue、失敗時にfalseを返します。ステータスコードの設定は、スクリプトの実行が完了する前にクライアントに送信されるHTTPレスポンスに影響を与えます。

HTTPステータスコードは、Webアプリケーションの状態や結果をクライアントに伝えるために重要な役割を果たします。例えば、リダイレクト(301, 302)、クライアントエラー(400, 404)、サーバーエラー(500, 503)などを適切に設定することで、ユーザーエクスペリエンスを向上させ、SEO対策にも貢献できます。http_response_code関数は、Webアプリケーション開発において、このようなHTTPステータスコードを制御するための基本的なツールとなります。

基本的な使い方

構文(syntax)

<?php
http_response_code(200);
?>

引数(parameters)

int $response_code = 0

  • int $response_code = 0: 設定するHTTPレスポンスコードを指定する整数。デフォルトは0で、取得のみを行う。

戻り値(return)

int|false

HTTP レスポンスコードを取得または設定します。成功した場合は HTTP ステータスコードの整数値を、失敗した場合は false を返します。

サンプルコード

PHP http_response_code関数と定数でステータスを設定する

<?php

/**
 * PHPのhttp_response_code関数とHTTPレスポンスコード定数の使用例。
 *
 * http_response_code関数は、HTTPレスポンスのステータスコードを設定または取得するために使用されます。
 * PHPのコアには、HTTPステータスコードのための組み込み定数(例:HTTP_OK)は提供されていません。
 * これらは通常、フレームワークやPECL HTTP拡張機能によって定義されるか、
 * この例のように、コードの可読性と保守性のために開発者が独自に定義します。
 */

// よく使われるHTTPレスポンスコードを定数として定義します。
// これにより、マジックナンバー(直接的な数値)の使用を避け、コードが分かりやすくなります。
const HTTP_OK = 200;                    // 成功
const HTTP_MOVED_PERMANENTLY = 301;     // 恒久的なリダイレクト
const HTTP_FOUND = 302;                 // 一時的なリダイレクト
const HTTP_BAD_REQUEST = 400;           // クライアントエラー(不正なリクエスト)
const HTTP_NOT_FOUND = 404;             // リソースが見つからない
const HTTP_INTERNAL_SERVER_ERROR = 500; // サーバーエラー

/**
 * HTTPレスポンスコードを設定し、取得する処理をデモンストレーションします。
 *
 * この関数は、GETクエリパラメータ 'status' に応じて異なるHTTPステータスコードを設定します。
 * 'status' パラメータが指定されない場合、または認識されない場合は、デフォルトのステータスコードを設定します。
 *
 * 実行方法:
 * - 直接アクセス: http://localhost/your_script.php (HTTP_OK: 200)
 * - 'notfound' ステータスでアクセス: http://localhost/your_script.php?status=notfound (HTTP_NOT_FOUND: 404)
 * - 'redirect' ステータスでアクセス: http://localhost/your_script.php?status=redirect (HTTP_FOUND: 302 - 一時リダイレクト)
 * - 'moved' ステータスでアクセス: http://localhost/your_script.php?status=moved (HTTP_MOVED_PERMANENTLY: 301 - 恒久リダイレクト)
 * - 'error' ステータスでアクセス: http://localhost/your_script.php?status=error (HTTP_INTERNAL_SERVER_ERROR: 500)
 * - 不明なステータスでアクセス: http://localhost/your_script.php?status=unknown (HTTP_BAD_REQUEST: 400)
 */
function demonstrateHttpResponseCode(): void
{
    // デフォルトのステータスコードをHTTP_OK (200) に設定します。
    $statusCodeToSet = HTTP_OK;
    $redirectLocation = '';

    // GETパラメータ 'status' に基づいて、設定するステータスコードを決定します。
    if (isset($_GET['status'])) {
        switch ($_GET['status']) {
            case 'notfound':
                $statusCodeToSet = HTTP_NOT_FOUND;
                break;
            case 'redirect':
                $statusCodeToSet = HTTP_FOUND;
                // リダイレクトの場合、Locationヘッダも設定するのが一般的です。
                $redirectLocation = '/temporary-destination.php';
                break;
            case 'moved':
                $statusCodeToSet = HTTP_MOVED_PERMANENTLY;
                // 恒久的なリダイレクトの場合もLocationヘッダを設定します。
                $redirectLocation = '/permanent-destination.php';
                break;
            case 'error':
                $statusCodeToSet = HTTP_INTERNAL_SERVER_ERROR;
                break;
            default:
                // 未知のステータスが指定された場合は、不正なリクエストとして扱います。
                $statusCodeToSet = HTTP_BAD_REQUEST;
                break;
        }
    }

    // http_response_code() 関数を使用してHTTPレスポンスコードを設定します。
    // この関数は、HTTPステータスライン (例: HTTP/1.1 200 OK) を送信します。
    // 引数を与えると、その値を設定し、以前のステータスコードを返します。
    // 設定に失敗した場合は false を返します。
    $previousStatusCode = http_response_code($statusCodeToSet);

    // リダイレクトが必要な場合は、Locationヘッダを送信します。
    // http_response_code()はステータスラインを設定するのみで、Locationヘッダは別途必要です。
    if (!empty($redirectLocation)) {
        header('Location: ' . $redirectLocation, true, $statusCodeToSet);
        // リダイレクトヘッダを送信した後、スクリプトの実行を終了するのが一般的です。
        // デモンストレーションのため、ここでは続行します。
    }

    // http_response_code() 関数を引数なしで呼び出すと、現在設定されているHTTPレスポンスコードを取得できます。
    // まだ何も設定されていない場合や、設定に失敗した場合は false を返します。
    $currentStatusCode = http_response_code();

    // デモンストレーションのための出力
    echo "<h1>HTTP Response Code Example</h1>";
    echo "<p><strong>リクエストされたステータスパラメータ:</strong> " . ($_GET['status'] ?? 'N/A') . "</p>";
    echo "<p><strong>設定を試みたステータスコード:</strong> " . $statusCodeToSet . "</p>";
    echo "<p><strong>実際に設定されたHTTPレスポンスコード:</strong> " . ($currentStatusCode === false ? '設定失敗' : $currentStatusCode) . "</p>";
    echo "<p><strong>http_response_code()呼び出し前のステータスコード:</strong> " . ($previousStatusCode === false ? '利用不可' : $previousStatusCode) . "</p>";

    // ステータスコードに応じたメッセージを表示します。
    switch ($currentStatusCode) {
        case HTTP_OK:
            echo "<p>メッセージ: リクエストは正常に処理されました。</p>";
            break;
        case HTTP_NOT_FOUND:
            echo "<p>メッセージ: 指定されたリソースは見つかりませんでした。</p>";
            break;
        case HTTP_FOUND:
            echo "<p>メッセージ: このページは一時的に別の場所へ移動しました。ブラウザによっては自動的にリダイレクトされます。</p>";
            break;
        case HTTP_MOVED_PERMANENTLY:
            echo "<p>メッセージ: このページは恒久的に別の場所へ移動しました。ブラウザによっては自動的にリダイレクトされます。</p>";
            break;
        case HTTP_BAD_REQUEST:
            echo "<p>メッセージ: クライアントからのリクエストが不正です。</p>";
            break;
        case HTTP_INTERNAL_SERVER_ERROR:
            echo "<p>メッセージ: サーバー内部で予期せぬエラーが発生しました。</p>";
            break;
        default:
            echo "<p>メッセージ: 未知のステータスコードか、対応していないケースです。</p>";
            break;
    }

    // 注意: http_response_code() や header() のようなヘッダ送信関数は、
    // 実際のコンテンツ(echoなど)をブラウザに出力する前に呼び出す必要があります。
    // コンテンツが出力された後にヘッダを送信しようとすると、「Headers already sent」エラーが発生します。
}

// 例示関数を実行します。
demonstrateHttpResponseCode();

PHPのhttp_response_code関数は、Webサーバーがクライアント(ブラウザなど)に返すHTTPレスポンスのステータスコードを設定または取得するために使用されます。この関数に整数値の引数$response_code(例: 200, 404, 500)を指定すると、その値が現在のHTTPステータスコードとして設定され、設定前のステータスコードが整数値で返されます。設定に失敗した場合はfalseが返されます。引数を省略して呼び出すと、現在設定されているHTTPステータスコードを整数値で取得できます。

サンプルコードでは、PHPの標準機能にはHTTPステータスコードの組み込み定数が存在しないため、コードの可読性を高めるためにHTTP_OK(200)やHTTP_NOT_FOUND(404)といった独自の定数を定義しています。これにより、数値リテラル(マジックナンバー)を避け、コードの意図が明確になります。

HTTPステータスコードが301(恒久的なリダイレクト)や302(一時的なリダイレクト)のようなリダイレクトを示す場合、http_response_code関数でステータスコードを設定するだけでなく、header('Location: ...')関数を使ってリダイレクト先のURLを別途指定する必要があります。重要な点として、これらのHTTPヘッダを送信する関数は、echoなどを使ってWebページの内容が出力される前に行う必要があります。出力後にヘッダを送信しようとするとエラーが発生しますのでご注意ください。この関数は、Webアプリケーションの応答を細かく制御し、ユーザーや検索エンジンに適切な情報(例: ページが見つからない、リソースが移動したなど)を伝える上で非常に重要です。

http_response_code関数は、HTTPステータスコードを設定・取得する際に使われます。最も重要な注意点は、この関数やheader関数は、echoなどのコンテンツ出力よりも前に呼び出す必要があることです。出力後に呼び出すと「Headers already sent」エラーが発生し、正しく動作しません。

PHPにはHTTPステータスコードの組み込み定数が無いため、コードの可読性と保守性を高めるには、サンプルコードのように開発者が独自の定数を定義することが推奨されます。リダイレクト(3xx系ステータスコード)を設定する際は、http_response_code関数だけでなく、別途header('Location: ...')も併用し、通常はその後exitでスクリプトの実行を終了します。サンプルコードではデモンストレーションのため続けていますが、実運用ではexitが必要です。

引数を指定せずに関数を呼び出すと、現在設定されているステータスコードを取得できます。設定に失敗した場合や未設定の場合はfalseが返されるため、戻り値の確認も重要です。

PHP: http_response_code でステータスコードとメッセージを設定する

<?php

/**
 * このスクリプトは、PHPのhttp_response_code関数を使用して
 * HTTPステータスコードを設定し、そのステータスに応じた
 * ユーザー向けメッセージをWebページに表示する例を示します。
 *
 * クエリパラメータ 'status' を使用して、試すステータスコードを
 * 指定できます。例:
 *   http://localhost/index.php?status=200 (成功)
 *   http://localhost/index.php?status=404 (ページが見つからない)
 *   http://localhost/index.php?status=500 (サーバーエラー)
 */

// デフォルトのHTTPステータスコードとメッセージを設定
$statusCode = 200;
$statusReason = "OK"; // HTTPステータスラインの理由句 (PHPが自動で設定する場合もあるが、ここでは表示用)
$displayMessage = "リクエストは正常に処理されました。";

// GETパラメータからステータスコードを取得し、対応するメッセージを準備
if (isset($_GET['status'])) {
    $requestedStatus = (int)$_GET['status']; // 整数に変換

    switch ($requestedStatus) {
        case 200:
            $statusCode = 200;
            $statusReason = "OK";
            $displayMessage = "リクエストは成功し、要求された情報が返されました。";
            break;
        case 404:
            $statusCode = 404;
            $statusReason = "Not Found";
            $displayMessage = "お探しのページは見つかりませんでした。URLが正しいかご確認ください。";
            break;
        case 500:
            $statusCode = 500;
            $statusReason = "Internal Server Error";
            $displayMessage = "サーバー内部でエラーが発生しました。しばらくしてから再度お試しください。";
            break;
        default:
            // 未知または無効なステータスコードが指定された場合
            $statusCode = 400;
            $statusReason = "Bad Request";
            $displayMessage = "無効なHTTPステータスコードが指定されました。";
            break;
    }
}

// http_response_code関数でHTTPステータスコードを設定します。
// この関数はHTTPレスポンスヘッダのステータスラインを変更します。
// 設定が成功した場合、設定されたコードが返り、失敗した場合はfalseが返ります。
$actualStatusCode = http_response_code($statusCode);

// ステータスコードの設定が失敗した場合の処理(まれに発生)
if ($actualStatusCode === false) {
    // ログに記録するなどのエラーハンドリングを行うことができます。
    error_log("Failed to set HTTP response code to " . $statusCode);
    $statusCode = 500; // 内部エラーとして扱う
    $statusReason = "Internal Server Error";
    $displayMessage = "サーバーエラーが発生しました。(ステータスコード設定失敗)";
    http_response_code($statusCode); // 再度500を試みる
}

// レスポンスのContent-Typeを設定(Webページ表示には推奨)
header('Content-Type: text/html; charset=UTF-8');

?>
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>HTTP ステータスコード: <?php echo htmlspecialchars($statusCode); ?></title>
    <style>
        body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; margin: 0; padding: 40px; background-color: #f0f2f5; color: #333; display: flex; justify-content: center; align-items: center; min-height: 100vh; }
        .container { background-color: #ffffff; padding: 40px; border-radius: 10px; box-shadow: 0 4px 15px rgba(0,0,0,0.1); max-width: 600px; text-align: center; }
        h1 { color: #dc3545; margin-bottom: 20px; font-size: 2.2em; }
        p { line-height: 1.6; font-size: 1.1em; color: #555; }
        .status-info { font-size: 1.5em; font-weight: bold; margin-bottom: 15px; color: #007bff; }
        .explanation { font-style: italic; color: #777; margin-top: 30px; border-top: 1px solid #eee; padding-top: 20px; }
        .links { margin-top: 25px; }
        .links a { display: inline-block; margin: 0 10px; padding: 8px 15px; background-color: #007bff; color: white; text-decoration: none; border-radius: 5px; transition: background-color 0.3s ease; }
        .links a:hover { background-color: #0056b3; }
    </style>
</head>
<body>
    <div class="container">
        <div class="status-info">
            HTTP ステータスコード: <?php echo htmlspecialchars($statusCode); ?> <?php echo htmlspecialchars($statusReason); ?>
        </div>
        <h1><?php echo htmlspecialchars($displayMessage); ?></h1>
        <p>
            このページは、<code>http_response_code()</code> 関数を使用して
            設定されたHTTPステータスコードと、それに対応するメッセージを表示しています。
        </p>
        <div class="explanation">
            現在のWebブラウザのHTTPステータスは <code><?php echo htmlspecialchars($statusCode); ?> <?php echo htmlspecialchars($statusReason); ?></code> です。<br>
            この値はPHPの <code>http_response_code(<?php echo htmlspecialchars($statusCode); ?>)</code> によって設定されました。
        </div>
        <div class="links">
            試す例:
            <a href="?status=200">200 OK</a>
            <a href="?status=404">404 Not Found</a>
            <a href="?status=500">500 Internal Server Error</a>
            <a href="?status=400">400 Bad Request</a>
        </div>
    </div>
</body>
</html>

PHPのhttp_response_code関数は、WebサーバーがWebブラウザなどのクライアントに返すHTTPステータスコードを設定するための重要な機能です。HTTPステータスコードは、Webリクエストの結果(成功、エラーなど)を数値で伝え、例えば「200」は成功、「404」はページが見つからない、「500」はサーバー内部エラーを示します。

この関数は、int $response_code = 0という引数を受け取ります。引数に設定したいステータスコード(例: 200, 404, 500)を整数で指定すると、WebサーバーのHTTPレスポンスヘッダにそのコードが設定されます。引数を省略するか0を指定した場合は、現在設定されているステータスコードを整数で取得できます。戻り値は、設定または取得されたステータスコードが整数で返され、設定が何らかの理由で失敗した場合にはfalseが返されます。

提供されたサンプルコードは、URLのクエリパラメータ(例: ?status=404)に応じて、Webページに表示するHTTPステータスコードとメッセージを動的に変更する方法を示しています。例えば、?status=404でアクセスすると、http_response_code(404)が実行され、ブラウザには「404 Not Found」というステータスが通知されます。同時に、スクリプトはユーザー向けの「お探しのページは見つかりませんでした。」というメッセージをWebページ上に表示します。この関数でHTTPヘッダが設定された後、header()関数でコンテンツタイプを指定し、HTMLコンテンツを生成しています。これにより、ユーザーはHTTPステータスコードとそれに紐づく情報を視覚的に確認できます。また、ステータスコードの設定が失敗した場合の簡単なエラー処理も含まれています。

http_response_code関数は、HTMLなど実際のコンテンツが出力される前に実行する必要があります。出力開始後に実行するとエラーが発生するため注意してください。また、この関数は設定失敗時にfalseを返すため、戻り値を必ず確認し、適切なエラー処理を実装することが重要です。

HTTPステータスコードは、Webページの状態をブラウザや検索エンジンに伝える重要な情報です。ユーザーへの表示メッセージとステータスコードの意味が一致しているか確認しましょう。クエリパラメータなど外部からの入力でステータスコードを設定する際は、整数型への変換や許可された値のみを受け入れることで、セキュリティに配慮してください。動的な内容を表示する際は、XSS対策としてhtmlspecialchars関数を常に使用してください。

【PHP8.x】http_response_code関数の使い方 | いっしー@Webエンジニア