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

作成日: 更新日:

connection_status関数は、現在実行中のPHPスクリプトとウェブクライアント間の接続状態を取得する関数です。この関数は、スクリプトが正常に実行されているか、またはクライアントからの接続が切断されたか、あるいはスクリプトの実行がタイムアウトしたかといった情報を提供します。

具体的には、以下のいずれかの定数、またはそれらを組み合わせたビットマスクの整数値を返します。CONNECTION_NORMALは接続が正常であることを示し、値は0です。CONNECTION_ABORTEDはクライアントが接続を切断したことを意味し、値は1です。CONNECTION_TIMEOUTはスクリプトの実行が設定された時間制限を超過したことを表し、値は2です。たとえば、クライアントが接続を切断し、かつスクリプトがタイムアウトした場合、これらの値のビットマスクが返されることがあります。

この関数は、特に時間のかかる処理を実行するスクリプトにおいて、クライアントが途中で接続を閉じてしまった場合でも、サーバー側で不要な処理を継続させないようにするために有用です。例えば、大きなファイルの生成やデータベースへの書き込みといった処理中に、クライアントが接続を終了したことを検知し、スクリプトの実行を中断したい場合に、connection_status関数の戻り値を確認することで、適切な判断を行うことができます。これにより、サーバーリソースの無駄遣いを防ぎ、効率的なシステム運用に貢献します。

基本的な使い方

構文(syntax)

<?php
$status = connection_status();
echo $status;
?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

int

現在のHTTP接続の状態を示す整数値を返します。

サンプルコード

PHPでMySQL接続ステータスを確認する

<?php

/**
 * MySQLデータベースへの接続を試行し、そのステータスを確認します。
 *
 * この関数は、mysqli拡張機能を使用してMySQLデータベースに接続し、
 * 接続が成功したかどうかを検証する方法を示します。
 *
 * @param string $host     データベースホスト (例: 'localhost')。
 * @param string $username データベースのユーザー名。
 * @param string $password データベースのパスワード。
 * @param string $database 接続するデータベース名。
 * @param int    $port     オプション。MySQLサーバーへ接続するポート番号。
 * @return bool 接続が成功した場合はtrue、それ以外はfalseを返します。
 */
function checkMySqlConnectionStatus(string $host, string $username, string $password, string $database, int $port = 3306): bool
{
    // MySQLiのエラー報告を例外としてスローするように設定
    // これにより、接続エラーやクエリエラーがtry-catchブロックで捕捉可能になります。
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

    try {
        // 新しいmysqliオブジェクトを作成して、データベースへの接続を試みます。
        // 接続に失敗した場合、mysqli_sql_exceptionがスローされます。
        $mysqli = new mysqli($host, $username, $password, $database, $port);

        // 接続が確立された場合、オブジェクトが返され、この行に到達します。
        // ここで接続を閉じ、成功を返します。
        $mysqli->close();
        
        return true; // 接続成功
    } catch (mysqli_sql_exception $e) {
        // データベース接続エラーが発生した場合、ここで捕捉されます。
        // 初心者向けに、エラーメッセージをログに出力するか、より詳細な情報を提供できます。
        error_log("MySQL 接続エラー: " . $e->getMessage());
        return false; // 接続失敗
    }
}

// データベース接続情報 (ご自身の環境に合わせて変更してください)
$dbHost = 'localhost';
$dbUser = 'root';
$dbPass = 'your_password'; // ★★★ 実際のMySQLパスワードに置き換えてください ★★★
$dbName = 'test_database'; // ★★★ 接続したいデータベース名に置き換えてください ★★★
$dbPort = 3306; // 通常のMySQLポート

// 関数を実行し、接続ステータスを表示
if (checkMySqlConnectionStatus($dbHost, $dbUser, $dbPass, $dbName, $dbPort)) {
    echo "MySQLデータベースへの接続に成功しました。\n";
} else {
    echo "MySQLデータベースへの接続に失敗しました。\n";
    echo "接続情報、データベースの状態、またはMySQLエラーログを確認してください。\n";
}

?>

このPHPサンプルコードは、MySQLデータベースへの接続が正しく行えるかどうかを確認する方法を示しています。checkMySqlConnectionStatus関数は、指定されたホスト、ユーザー名、パスワード、データベース名、ポート番号を用いてMySQLデータベースへの接続を試みます。

関数内部では、mysqli_reportによりMySQLiのエラーを例外として扱う設定がされており、堅牢なエラーハンドリングを実現しています。try-catchブロックを使用することで、データベース接続時に発生する可能性のあるmysqli_sql_exception(接続エラーなど)を捕捉し、プログラムの予期せぬ停止を防ぎます。

接続が成功した場合、new mysqli()でデータベースオブジェクトが作成され、その後$mysqli->close()で接続を閉じ、関数はtrueを返します。接続に失敗した場合はcatchブロックが実行され、エラーメッセージをログに出力し、関数はfalseを返します。

この関数の引数には、MySQLサーバーへの接続に必要な情報(ホスト名、ユーザー名、パスワード、データベース名、ポート番号)を渡します。戻り値は、接続が成功すればブール値のtrue、失敗すればfalseです。これにより、データベースへのアクセスが可能かどうかの状態を簡単に確認できます。

このサンプルコードは、PHPの組み込み関数connection_statusとは異なり、mysqli拡張機能を使用してMySQLデータベースへの接続可否を判断するものです。組み込み関数はHTTPクライアントとの接続状態を確認する際に利用しますので、混同しないようご注意ください。 データベースのホスト、ユーザー名、パスワード、データベース名は、必ずご自身の環境に合わせて正確に設定してください。特にパスワードは本番環境では直接コードに記述せず、設定ファイルなど外部から安全に読み込む方法を検討しましょう。 また、PHP環境でmysqli拡張機能が有効になっていることを確認してください。接続失敗時には、エラーメッセージやMySQLサーバーの稼働状況を確認することが重要です。

PHPで接続状態をチェックする

<?php

/**
 * クライアントとの接続状態を定期的にチェックする関数
 *
 * このスクリプトは、Webサーバー環境で実行する必要があります。
 * 実行中にブラウザのタブを閉じたり、ページの読み込みを停止したりすると、
 * 接続状態が 'ABORTED' に変わることを確認できます。
 * コマンドライン (CLI) 環境では、接続状態は常に 'NORMAL' (0) となります。
 *
 * @return void
 */
function checkClientConnectionStatus(): void
{
    // PHPの実行時間制限を解除(長時間実行のため)
    set_time_limit(0);
    // ユーザーによる接続中断を検知できるようにする
    ignore_user_abort(false);

    header('Content-Type: text/plain; charset=utf-8');
    // 出力バッファリングを無効にし、出力を即座にクライアントへ送信する
    ob_end_flush();

    echo "クライアントとの接続状態を15秒間、1秒ごとにチェックします。\n";
    echo "処理中にブラウザを閉じるか、読み込みを停止してみてください。\n\n";
    flush();

    for ($i = 1; $i <= 15; $i++) {
        // 現在の接続状態を取得する
        // 戻り値: 0 (NORMAL), 1 (ABORTED), 2 (TIMEOUT)
        $status = connection_status();

        // 接続状態を人間が読みやすい文字列に変換
        $statusText = match ($status) {
            CONNECTION_NORMAL => 'NORMAL (正常)',
            CONNECTION_ABORTED => 'ABORTED (中断)',
            CONNECTION_TIMEOUT => 'TIMEOUT (タイムアウト)',
            default => 'UNKNOWN (不明)',
        };

        echo "{$i}秒経過: 接続状態は {$statusText} です。\n";
        flush();

        // 接続が正常でない場合、処理を中断する
        if ($status !== CONNECTION_NORMAL) {
            // 本来はここでログ記録などの後処理を行う
            error_log('Client connection was lost. Status: ' . $statusText);
            break;
        }

        // 1秒待機
        sleep(1);
    }

    if (connection_status() === CONNECTION_NORMAL) {
        echo "\nチェックが完了しました。接続は正常に維持されました。\n";
    } else {
        echo "\nクライアントとの接続が切断されたため、処理を中断しました。\n";
    }
}

// 関数を実行
checkClientConnectionStatus();

connection_status関数は、PHPスクリプトを実行しているサーバーと、ページを閲覧しているユーザーのブラウザ(クライアント)との間の接続状態を取得するための関数です。この関数は引数を必要としません。

戻り値は、接続状態を表す整数(int型)です。主に3つの状態があり、0 (CONNECTION_NORMAL) は接続が正常な状態、1 (CONNECTION_ABORTED) はユーザーがブラウザを閉じるなどして接続が中断された状態、2 (CONNECTION_TIMEOUT) はタイムアウトによって接続が切れた状態を示します。

サンプルコードは、時間のかかる処理の途中でユーザーが離脱していないかを確認する実用的な例です。1秒ごとにconnection_status()を呼び出し、戻り値が正常を示すCONNECTION_NORMALでなくなった場合にループ処理を中断しています。これにより、ユーザーがページを離れた後もサーバー側で無駄な処理を続けることを防ぎ、リソースを効率的に使用できます。

なお、この関数はWebサーバー環境で動作させた場合に意味を持ちます。コマンドライン環境で実行した場合、接続の概念がないため常に正常状態である0を返します。

この connection_status 関数は、データベースとの接続ではなく、ユーザーのブラウザとWebサーバー間の接続状態を確認するものです。そのため、Webサーバー環境でのみ意図通りに動作し、コマンドラインから実行した場合は常に「正常」を返します。サンプルコードのように、時間のかかる処理中にユーザーがページを閉じたことを検知し、サーバー側で処理を安全に中断させたい場合に有効です。set_time_limit(0) で実行時間制限を解除していますが、サーバーに負荷をかける可能性があるため、必要な場合にのみ使用してください。また、ignore_user_abort 関数の設定により、接続が切れた後も処理を続行するかどうかを制御できます。

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