Bei Verwendung von PHP für Socket-basierte Programmierung ist Socket_accept () eine Schlüsselfunktion, die Verbindungen von Clients akzeptiert. Wenn der Funktionsaufruf jedoch fehlschlägt, kann ein Fehler geworfen werden, wodurch das Programm brechen oder unvorhersehbares Verhalten hat. Daher ist es sehr notwendig, diese Fehler zu fangen und im Protokoll im Protokoll aufzuzeichnen.
In diesem Artikel wird ausführlich vorgestellt, wie Sie die Fehler der Funktion socket_accept () erfassen und in einer Protokolldatei protokollieren können.
Hier ist ein Basic Socket Server -Beispiel:
<?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 () wird beim Versagen falsch zurückgegeben. Um den Fehlercode zu fangen und das Protokoll zu protokollieren, können Sie ihn wie folgt verarbeiten:
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");
// Sie können die Schleife nach Bedarf fortsetzen oder beenden
continue;
}
// Verarbeitungslogik nach Empfangen der Verbindung
$msg = "Hello from server on http://m66.net\n";
socket_write($clientSocket, $msg, strlen($msg));
socket_close($clientSocket);
}
In diesem Code:
Der @ -Operator wird verwendet, um die Standardwarnung von Socket_accept () zu unterdrücken.
socket_last_error () erhält den Fehlercode des letzten Socket -Vorgangs;
socket_strerror () konvertiert den Fehlercode in menschenlesbare Zeichenfolgen;
IRRAL_LOG () schreibt Fehler in /var/log/php_socket_error.log -Datei.
HINWEIS: Stellen Sie sicher, dass Sie die Berechtigung haben, in den Log -Dateipfad zu schreiben und dass das übergeordnete Verzeichnis der Protokolldatei vorhanden ist.
Sie können das Fehlerprotokoll auch in eine Funktion für Multiplexing und einheitliches Formatausgang einkapseln:
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");
}
Wie man es benutzt, ist wie folgt:
$clientSocket = @socket_accept($socket);
if ($clientSocket === false) {
log_socket_error($socket, 'socket_accept');
continue;
}
Mit der obigen Methode können Sie bei Verwendung von Socket_accept () Fehler effektiv fangen und aufzeichnen, um einen stillen Versagen des Servers zu vermeiden oder Schwierigkeiten zu debuggen. Gleichzeitig erleichtert das Schreiben von Protokollen in Dateien auch die nachfolgenden Betriebs- und Wartungsprüfungen sowie die Integration automatischer Überwachungssysteme. In den tatsächlichen Produktionsumgebungen wird auch empfohlen, ähnliche Elche oder andere zentralisierte Protokollierungsschemata zu verwenden, um die Beobachtbarkeit weiter zu verbessern.