Dans PHP Network Programming, socket_set_blocking () est une fonction clé qui contrôle si un socket s'exécute de manière bloquante. Comprendre son comportement et sa maîtrise les compétences de débogage est crucial pour développer des applications de réseau stables et fiables. Cet article expliquera en profondeur comment déboguer le comportement de blocage de socket_set_blocking () et fournir des conseils pratiques et des étapes détaillées.
Lorsque vous utilisez des fonctions de socket PHP, la différence entre le blocage et le non-blocage est:
Mode de blocage : Lorsque des fonctions telles que socket_read () et socket_accept () sont appelées, le processus accrochera jusqu'à ce que les données soient lisibles ou qu'il existe une demande de connexion.
Mode non bloquant : lors de l'appel de ces fonctions, s'il n'y a pas de données ou pas de demande de connexion, la fonction reviendra immédiatement, renvoie généralement fausse et définit socket_last_error () au code d'erreur correspondant.
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, 'gitbox.net', 80);
// Défini sur le mode de blocage
socket_set_blocking($socket, true);
À ce stade, si vous exécutez un appel socket_read () , il attendra que les données reviennent.
Pour régler sur le non-bloc:
socket_set_blocking($socket, false);
Lorsque vous définissez sur le non-blocage, vous pouvez utiliser socket_select () pour détecter s'il est lisible / écrivable:
$read = [$socket];
$write = $except = null;
$changed = socket_select($read, $write, $except, 5); // temps mort 5 Deuxième
if ($changed > 0) {
$data = socket_read($socket, 1024);
echo "Données reçues: $data\n";
} else {
echo "等待temps mort,未Données reçues\n";
}
Cette méthode convient également au comportement de blocage du débogage. En mode blocage, socket_select () peut également aider à déterminer si le blocage se déroule comme prévu.
Bien que tous les scénarios ne soient pas applicables, Stream_Socket_Client () fournit des méthodes de contrôle similaires et permet de définir des délais d'attente pour aider à déboguer.
$fp = stream_socket_client("tcp://gitbox.net:80", $errno, $errstr, 30);
stream_set_blocking($fp, true);
// Ou utiliser stream_set_blocking($fp, false); Réglé sur le non-blocage
En comparant le comportement de réponse des deux dans des paramètres différents, le problème peut être situé efficacement.
Lors du débogage du comportement de blocage, si le serveur amarré répond trop rapidement, il peut être difficile d'observer l'effet. Vous pouvez vérifier que le blocage est efficace en construisant un serveur temporaire (comme l'utilisation de Python ou PHP) et de l'ajout de retards.
Par exemple, le code côté serveur retarde délibérément:
$client = socket_accept($serverSocket);
sleep(10); // Blocage de simulation
socket_write($client, "Hello after delay");
Le client doit attendre cette période en mode de blocage et reviendra immédiatement dans le non-blocage.
L'utilisation de socket_last_error () et socket_strorror () peut plus clairement localiser les problèmes de blocage.
if ($data === false) {
$error = socket_last_error($socket);
echo "Code d'erreur: $error,décrire: " . socket_strerror($error);
}
Les erreurs courantes telles que Eagain , Ewouldblock , etc. indiquent qu'il n'y a pas de données à lire lorsqu'ils essaient de lire en mode non bloquant.
Définition incorrecte de la séquence d'état de blocage : le blocage du réglage avant la connexion n'est pas aussi bon que le réglage après la connexion, l'effet peut être différent et l'ordre doit être clair pendant le débogage.
Manquant le paramètre de délai d'expiration de socket_select () : la valeur par défaut est de bloquer et d'attendre. Si le délai d'attente n'est pas défini lors du débogage, il pensera à tort que la prise a été coincée.
Valeur de retour non transformée : lors du débogage du comportement de blocage, l'ignorance de la valeur de retour entraînera qu'il est impossible de déterminer si la fonction est bloquée.
La compréhension et le débogage correct du comportement de blocage de socket_set_blocking () est une partie importante de la maîtrise de la programmation de socket PHP. En utilisant rationnellement socket_select () , les tests de journalisation et de simulation, vous pouvez contrôler efficacement le flux d'exécution des programmes réseau et améliorer l'efficacité de la robustesse et de la réponse du système. J'espère que les conseils et les étapes fournis dans cet article peuvent vous aider à devenir plus pratique dans le développement réel.