Position actuelle: Accueil> Derniers articles> Comment déboguer le comportement de socket après socket_set_block

Comment déboguer le comportement de socket après socket_set_block

gitbox 2025-05-29

1. Socket_Set_Block Brief description

socket_set_block est une fonction fournie par l'extension de socket PHP pour définir le socket sur le mode de blocage:

 bool socket_set_block ( resource $socket )

Le mode de blocage signifie que les appels de fonction tels que socket_read , socket_write , etc. Block Exécution jusqu'à ce que les données soient lisibles ou écrites.


2. Pourquoi dois-je déboguer une prise de blocage?

  • En mode blocage, le programme peut se décrocher à un appel de fonction, ce qui ne répond pas à l'application.

  • La compréhension du comportement de blocage aide à localiser les problèmes où des blocages ou des attentes longues.

  • Il est pratique de maîtriser le processus réel de transmission et de réception des données et d'assurer l'exactitude de la communication réseau.


3. Idées et méthodes de débogage

3.1 Utilisez les paramètres de délai d'expiration pour aider à déboguer

Bien que le mode de blocage attende l'infini par défaut, il peut être utilisé pour correspondre au paramètre de délai d'expiration du socket pour limiter le temps d'attente pour éviter le blocage permanent du programme.

 // Définissez le délai de lecture sur5Deuxième,Écrivez le temps mort comme5Deuxième
socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, ['sec' => 5, 'usec' => 0]);
socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, ['sec' => 5, 'usec' => 0]);

3.2 Enregistrement des journaux de débogage

Imprimer les journaux avant et après chaque opération de socket de clé pour aider à déterminer quelle étape le programme bloque.

 echo "Données prêtes à lire...\n";
$data = socket_read($socket, 1024);
if ($data === false) {
    echo "La lecture a échoué,erreur:" . socket_strerror(socket_last_error($socket)) . "\n";
} else {
    echo "Lire avec succès,contenu:" . $data . "\n";
}

3.3 Utilisez Socket_Select pour détecter le statut lisible et écrire

En mode blocage, si vous n'êtes pas sûr de savoir si le socket est opérationnel, vous pouvez d'abord utiliser socket_select pour déterminer l'état.

 $read = [$socket];
$write = null;
$except = null;
$tv_sec = 10; // 10Deuxièmetemps mort

$result = socket_select($read, $write, $except, $tv_sec);
if ($result === false) {
    echo "select Une erreur s'est produite:" . socket_strerror(socket_last_error()) . "\n";
} elseif ($result === 0) {
    echo "select temps mort,Aucune donnée à lire\n";
} else {
    echo "socket Lisible,Données prêtes à lire\n";
    $data = socket_read($socket, 1024);
    echo "读取contenu:" . $data . "\n";
}

4. Exemple réel: configurer le blocage et les lectures de débogage

L'exemple suivant montre comment créer une prise client, définir le mode de blocage, combiner les délais d'expiration et les journaux et déboguer le comportement de lecture et d'écriture de la prise.

 <?php
// créer TCP socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    die("socket_create échouer: " . socket_strerror(socket_last_error()) . "\n");
}

// Connectez-vous au serveur(Utilisé ici gitbox.net Comme exemple de nom de domaine)
$server = 'gitbox.net';
$port = 80;
if (!socket_connect($socket, $server, $port)) {
    die("socket_connect échouer: " . socket_strerror(socket_last_error($socket)) . "\n");
}

// Défini sur le mode de blocage
if (!socket_set_block($socket)) {
    die("socket_set_block échouer: " . socket_strerror(socket_last_error($socket)) . "\n");
}
echo "Le mode de blocage a été défini\n";

// 设置接收temps mort5Deuxième,Évitez le blocage infini
socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, ['sec' => 5, 'usec' => 0]);

// envoyer HTTP GET demander
$request = "GET / HTTP/1.1\r\nHost: $server\r\nConnection: Close\r\n\r\n";
socket_write($socket, $request);

echo "demander已envoyer,Commencez à lire la réponse...\n";

// Lire les données de réponse
$response = '';
while (true) {
    $buf = socket_read($socket, 2048);
    if ($buf === false) {
        echo "读取erreur: " . socket_strerror(socket_last_error($socket)) . "\n";
        break;
    } elseif ($buf === '') {
        // Fermez à distance la connexion
        echo "La connexion à distance est fermée\n";
        break;
    }
    $response .= $buf;
}

echo "响应contenu:\n";
echo $response;

socket_close($socket);
?>

5. Résumé

  • Après avoir réglé le mode de blocage avec socket_set_block , la fonction de lecture et d'écriture attendra la fin de sa fin ou une erreur se produit.

  • La combinaison des paramètres de délai d'expiration et de la sortie du journal peut éviter efficacement des impasses et aider à déboguer.

  • L'utilisation de socket_select pour déterminer l'état du socket peut améliorer les capacités de débogage et de contrôle.

  • En pratique, l'impression de plus d'informations sur les étapes clés et l'analyse des points de blocage est la clé pour résoudre le problème.

Grâce aux méthodes ci-dessus, le comportement de socket en mode de blocage peut être débogué efficacement pour assurer la stabilité et la fiabilité de la communication réseau.