現在の位置: ホーム> 最新記事一覧> socket_accept()によってスローされたエラーコードとログをキャッチする方法

socket_accept()によってスローされたエラーコードとログをキャッチする方法

M66 2025-05-22

ソケットベースのプログラミングにPHPを使用する場合、 socket_accept()は、クライアントからの接続を受け入れる重要な関数です。ただし、関数呼び出しが失敗した場合、エラーがスローされ、プログラムが破損または予測不可能な動作が発生する可能性があります。したがって、これらのエラーをキャッチし、ログに記録することは、デバッグと操作とメンテナンスに非常に必要です。

この記事では、socket_accept()関数のエラーをキャッチし、ログファイルにログに記録する方法を詳細に紹介します。

基本的な例

これが基本的なソケットサーバーの例です。

 <?php

$host = '0.0.0.0';
$port = 8080;

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    error_log("socket_create() failed: " . socket_strerror(socket_last_error()) . "\n", 3, "/var/log/php_socket_error.log");
    exit;
}

if (!socket_bind($socket, $host, $port)) {
    error_log("socket_bind() failed: " . socket_strerror(socket_last_error($socket)) . "\n", 3, "/var/log/php_socket_error.log");
    exit;
}

if (!socket_listen($socket, 5)) {
    error_log("socket_listen() failed: " . socket_strerror(socket_last_error($socket)) . "\n", 3, "/var/log/php_socket_error.log");
    exit;
}

socket_accept()エラーをキャッチします

socket_accept()は、障害時にfalseを返します。エラーコードをキャッチしてログをログにするには、次のように処理できます。

 while (true) {
    $clientSocket = @socket_accept($socket);
    if ($clientSocket === false) {
        $errCode = socket_last_error($socket);
        $errMsg = socket_strerror($errCode);
        error_log("socket_accept() failed with error [$errCode]: $errMsg\n", 3, "/var/log/php_socket_error.log");

        // 必要に応じてループを継続または終了することを選択できます
        continue;
    }

    // 接続を受信した後のロジックの処理
    $msg = "Hello from server on http://m66.net\n";
    socket_write($clientSocket, $msg, strlen($msg));
    socket_close($clientSocket);
}

このコードで:

  • @オペレーターは、socket_accept()によってスローされたデフォルトの警告を抑制するために使用されます。

  • socket_last_error()最後のソケット操作のエラーコードを取得します。

  • socket_strerror()は、エラーコードを人間の読み取り可能な文字列に変換します。

  • error_log() /var/log/php_socket_error.logファイルにエラーを書き込みます。

注:ログファイルパスに書き込む許可があり、ログファイルの親ディレクトリが存在することを確認してください。

読みやすさとメンテナンスを改善します

また、エラーログをマルチプレックスおよび統合形式の出力の関数にカプセル化することもできます。

 function log_socket_error($socket, $context = '') {
    $errCode = socket_last_error($socket);
    $errMsg = socket_strerror($errCode);
    $timestamp = date('Y-m-d H:i:s');
    $logEntry = "[$timestamp] [$context] Error [$errCode]: $errMsg\n";
    error_log($logEntry, 3, "/var/log/php_socket_error.log");
}

それを使用する方法は次のとおりです。

 $clientSocket = @socket_accept($socket);
if ($clientSocket === false) {
    log_socket_error($socket, 'socket_accept');
    continue;
}

結論

上記の方法を使用すると、 Socket_Accept()を使用すると、エラーを効果的にキャッチおよび記録して、サーバーのサイレント障害やデバッグの問題を回避できます。同時に、ファイルへのログを書くことで、自動監視システムの後続の操作とメンテナンスのチェックと統合も容易になります。実際の生産環境では、類似のヘラジカまたはその他の集中伐採スキームを使用して、観察性をさらに高めることもお勧めします。