Position actuelle: Accueil> Derniers articles> Comment attraper le code d'erreur et le journal lancé par socket_accept ()

Comment attraper le code d'erreur et le journal lancé par socket_accept ()

M66 2025-05-22

Lorsque vous utilisez PHP pour la programmation basée sur les socket, socket_accept () est une fonction clé qui accepte les connexions des clients. Cependant, si l'appel de la fonction échoue, une erreur peut être lancée, ce qui a provoqué la rupture du programme ou un comportement imprévisible. Par conséquent, la capture de ces erreurs et les enregistrer dans le journal est très nécessaire pour le débogage et le fonctionnement et la maintenance.

Cet article introduira en détail comment attraper les erreurs de la fonction socket_accept () et la connecter dans un fichier journal.

Exemples de base

Voici un exemple de serveur Socket de base:

 <?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;
}

Catch socket_accept () Erreur

socket_accept () renvoie false sur l'échec. Pour attraper le code d'erreur et enregistrer le journal, vous pouvez le gérer comme suit:

 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");

        // Vous pouvez choisir de continuer ou de résilier la boucle au besoin
        continue;
    }

    // Logique de traitement après avoir reçu la connexion
    $msg = "Hello from server on http://m66.net\n";
    socket_write($clientSocket, $msg, strlen($msg));
    socket_close($clientSocket);
}

Dans ce code:

  • L'opérateur @ est utilisé pour supprimer l'avertissement par défaut lancé par socket_accept () ;

  • socket_last_error () obtient le code d'erreur de la dernière opération de socket;

  • Socket_Sistror () convertit le code d'erreur en chaînes lisibles par l'homme;

  • error_log () écrit des erreurs sur /var/log/php_socket_error.log .

Remarque: assurez-vous d'avoir la permission d'écrire sur le chemin du fichier journal et que le répertoire parent du fichier journal existe.

Améliorer la lisibilité et la maintenance

Vous pouvez également encapsuler la connexion d'erreur à une fonction de multiplexage et de sortie de format unifié:

 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");
}

Comment l'utiliser est comme suit:

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

Conclusion

Grâce à la méthode ci-dessus, vous pouvez attraper et enregistrer efficacement les erreurs lors de l'utilisation de socket_accept () pour éviter les difficultés de défaillance ou de débogage silencieux du serveur. Dans le même temps, la rédaction de journaux aux fichiers facilite également les vérifications ultérieures de fonctionnement et de maintenance et l'intégration des systèmes de surveillance automatique. Dans les environnements de production réels, il est également recommandé d'utiliser des wapitis similaires ou d'autres schémas de journalisation centralisés pour améliorer encore l'observabilité.