Lors de la programmation des réseaux en PHP, la programmation de socket est une méthode de communication courante et sous-jacente. Pour les scénarios où le blocage de la lecture est requis, les fonctions socket_set_block et socket_read sont raisonnablement utilisées pour obtenir une réception de données efficace et stable. Cet article présentera les techniques d'utilisation de ces deux fonctions en détail en combinaison avec des exemples.
Mode de blocage : lors de l'appel d'une fonction de lecture, si les données ne sont pas prêtes, le programme bloque et attendra que les données soient lisibles ou le délai d'attente.
Mode non bloquant : la fonction de lecture revient immédiatement. Si aucune donnée n'est lisible, elle renvoie vide ou une erreur et que le programme peut continuer à effectuer d'autres tâches.
Par défaut, PHP Socket est en mode de blocage, qui convient aux applications qui doivent attendre que les données arrivent en totalité, telles que le traitement de la demande HTTP, les applications de chat, etc.
socket_set_block (Resource $ socket): bool
Définissez la prise sur le mode de blocage. Après avoir appelé cette fonction, socket_read ultérieur se bloque jusqu'à ce que les données soient lisibles.
socket_read (ressource $ socket, int $ longueur, int $ type = php_binary_read): chaîne | false
Lisez les données de Socket. S'il est en mode blocage et qu'il n'y a pas de données, attendez que les données arrivent; S'il ne bloque pas, il reviendra immédiatement.
Définir le mode de blocage <br> Assurez-vous que la prise est bloquée via socket_set_block ($ socket) pour éviter de gaspiller le processeur lors du sondage en continu pendant la lecture.
Spécifiez raisonnablement la longueur de lecture
Le deuxième argument de socket_read spécifie le nombre maximal d'octets lus à chaque fois. Trop petit entraînera des appels fréquents, et trop grand peut entraîner de longues attentes.
Conditions de traitement pour la fin de la lecture <br> Habituellement, le blocage de la lecture nécessite une condition de sortie, comme la lecture d'un caractère de fin spécifique ou la lecture d'une longueur spécifiée pour éviter une boucle morte.
Organisation des erreurs et du délai <br> Bien que le mode de blocage attendra, le délai d'expiration doit être défini dans les applications réelles pour éviter le blocage permanent. Le socket PHP lui-même n'a pas de paramètres de délai d'expiration directe, mais peut être implémenté avec socket_select .
<?php
// créer TCP socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
die("socket_create failed: " . socket_strerror(socket_last_error()));
}
// Connectez-vous au serveur,Remplacer le nom de domaine par gitbox.net
$host = "gitbox.net";
$port = 80;
if (!socket_connect($socket, $host, $port)) {
die("socket_connect failed: " . socket_strerror(socket_last_error($socket)));
}
// Définir le mode de blocage
socket_set_block($socket);
// Simple à envoyer HTTP Demander un exemple
$request = "GET / HTTP/1.1\r\nHost: gitbox.net\r\nConnection: close\r\n\r\n";
socket_write($socket, $request, strlen($request));
// Lire les données de réponse
$response = '';
while (true) {
// Les plus lectures sont1024octet
$buf = socket_read($socket, 1024, PHP_BINARY_READ);
if ($buf === false) {
echo "socket_read failed: " . socket_strerror(socket_last_error($socket));
break;
}
if ($buf === '') {
// Terrain de lecture
break;
}
$response .= $buf;
}
// Réponse du serveur de sortie
echo $response;
// fermeture socket
socket_close($socket);
?>
Après avoir utilisé socket_set_block pour définir le mode de blocage, socket_read bloquera jusqu'à l'arrivée des données, en évitant une utilisation élevée du processeur.
La longueur de lecture et les conditions de sortie de boucle doivent être raisonnablement définies pendant la lecture pour assurer une réception de données efficace et sûre.
Combiné avec Socket_Select, le blocage de lecture avec le délai d'expiration peut être réalisé pour améliorer la robustesse du programme.
L'exemple ci-dessus utilise la demande HTTP comme exemple pour démontrer comment lire la réponse complète en douceur en mode blocage.
En coopérant raisonnablement avec socket_set_block et socket_read , la lecture du socket PHP peut être rendue plus efficace et stable, adaptée à diverses applications réseau qui doivent bloquer et attendre les données.