Dans la programmation PHP, l'utilisation de sockets pour la communication réseau est une tâche courante. Surtout lorsque nous utilisons la fonction fsocckopen () ou créons une connexion TCP, nous sommes généralement confrontés à des problèmes de blocage causés par le retard du réseau ou d'autres raisons. Ce blocage peut empêcher votre programme de continuer à effectuer d'autres tâches en attendant les données, affectant les performances de réponse du système. Heureusement, PHP fournit une fonction socket_set_timeout () pour nous aider à résoudre ce problème et à éviter le blocage des douilles.
Dans la communication réseau, le blocage signifie que le programme ne peut pas continuer à exécuter un autre code en attendant que certaines opérations se terminent. Par exemple, si nous envoyons une demande via le socket et attendons une réponse, le programme s'arrêtera avant de recevoir la réponse et ne pouvons pas effectuer d'autres tâches. Le blocage à long terme réduira non seulement l'efficacité de l'application, mais peut également conduire à une mauvaise expérience utilisateur.
La fonction Socket_Set_Timeout () de PHP nous permet de définir un délai d'attente pour le socket. Lorsque le socket ne reçoit pas de réponse dans le délai spécifié, socket_set_timeout () termine l'opération et renvoie une erreur. En définissant l'heure du délai d'expiration, les opérations de socket peuvent être évitées pour un blocage long, garantissant que le programme ne répondra pas car il attend une réponse.
bool socket_set_timeout(resource $socket, int $seconds, int $microseconds = 0);
$ socket : la ressource de socket pour définir le délai d'attente.
$ secondes : le nombre de secondes qui ont expiré.
$ microsecondes : le nombre de délai d'expiration des microsecondes, par défaut est 0.
Cette fonction renvoie une valeur booléenne, vraie sur le succès et false sur l'échec.
Supposons que nous ayons un client TCP qui doit se connecter à un serveur distant et envoyer une demande. Si le serveur est lent à répondre ou il y a un problème de réseau, nous ne voulons pas que le programme soit coincé en attente indéfiniment pendant la connexion. Voici un exemple de code pour définir un délai d'expiration à l'aide de socket_set_timeout () :
<?php
// créersocket
$host = 'www.example.com';
$port = 80;
$socket = fsockopen($host, $port, $errno, $errstr, 10); // Essayez de se connecter10Deuxième
if (!$socket) {
echo "Impossible de se connecter:$errstr ($errno)\n";
exit;
}
// Définissez le temps mort sur5Deuxième
socket_set_timeout($socket, 5);
// Envoyer une demande
fwrite($socket, "GET / HTTP/1.1\r\nHost: $host\r\nConnection: Close\r\n\r\n");
// Lisez la réponse
$response = '';
while (!feof($socket)) {
$response .= fgets($socket, 128);
}
// Contenu de réponse de sortie
echo $response;
// fermeturesocket
fclose($socket);
?>
Créer une connexion à socket : utilisez la fonction fsocckopen () pour vous connecter au serveur distant et définir un délai d'expiration de connexion de 10 secondes.
Définir le délai d'expiration du socket : via la fonction socket_set_timeout () , nous définissons le délai de lecture des données sur 5 secondes. De cette façon, une fois que le temps de réponse du serveur dépasse 5 secondes, le programme mettra fin à l'attente et renverra une erreur.
Envoyez une demande et lisez la réponse : si la connexion est réussie et que la réponse ne retient pas, le programme enverra une demande HTTP et lira les données de réponse du serveur.
Prise de fermeture : Une fois l'opération terminée, nous utilisons fclose () pour fermer la connexion de la prise.
Évitez le blocage long : si le délai d'expiration n'est pas défini, l'opération de socket attendra que le serveur réponde. Si le serveur échoue ou si le réseau est en mauvais état, le programme peut bloquer pendant longtemps.
Améliorer la réactivité du système : la définition d'un délai d'expiration raisonnable peut garantir que le programme met fin aux demandes non valides en temps opportun et continue d'effectuer d'autres tâches pour maintenir la douceur du système.
Améliorer l'expérience utilisateur : dans les applications Web ou les services, la vitesse de réponse est un facteur important dans l'expérience utilisateur. En évitant le blocage des douilles, les utilisateurs peuvent rapidement obtenir des commentaires et améliorer la qualité du service.
Propriété du réglage du délai d'expiration : Le réglage du délai d'expiration doit être déterminé en fonction de l'environnement et des exigences du réseau spécifiques. Le réglage trop court peut provoquer des délais de connexion fréquents, et trop long peut ne pas être en mesure de détecter des problèmes à temps.
Manipulation des fluctuations du réseau : Dans certains cas, les fluctuations du réseau peuvent entraîner des délais d'attente fréquents, et un mécanisme de réessayer approprié doit être conçu.
Combiné avec la manipulation des exceptions : les erreurs de délai d'expiration peuvent être obtenues via socket_get_status () , et combinée avec le mécanisme de gestion des exceptions, les erreurs de délai d'expiration peuvent être gérées plus gracieusement.
En utilisant la fonction socket_set_timeout () , nous pouvons éviter efficacement le blocage des socket en PHP, garantissant que les opérations de réseau ne provoquent pas de stagnation à long terme de l'application. Définir le délai d'expiration peut raisonnablement améliorer l'efficacité et la réactivité du programme, mais aussi améliorer l'expérience utilisateur, en particulier lorsqu'ils sont confrontés à des retards de réseau ou à l'instabilité.