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