Dans PHP, Stream_Set_timeout est une fonction utilisée pour définir le délai d'expiration des ressources de flux, qui est souvent utilisée dans la communication réseau, les opérations de fichiers et d'autres scénarios. Surtout dans les services à long terme, il est crucial de définir raisonnablement le délai d'attente. Les services à longue connexion gardent souvent la connexion ouverte pendant longtemps et sont utilisés pour gérer la communication continue entre les clients et les serveurs, tels que le chat en direct, les jeux en ligne, les services push, etc.
La plus grande caractéristique des longues connexions est que la connexion ne se déconnecte pas fréquemment, contrairement aux connexions courtes, qui ferment généralement la connexion après chaque demande de demande. Les connexions longues doivent rester actives pendant longtemps, donc comment gérer le délai d'expiration de la connexion est un problème clé. stream_set_timeout est utilisé pour contrôler l'heure du délai d'expiration des opérations de flux (telles que la lecture, l'écriture, etc.) afin d'empêcher que la connexion soit occupée ou en suspension de manière illimité lorsqu'elle n'est pas active.
Dans Long Connection Services, Stream_Set_timeout a principalement les fonctions suivantes:
Empêcher les déchets de ressources : si le client n'interagit pas avec les données pendant longtemps, la connexion sur le serveur peut être suspendue, ce qui entraîne des ressources système gaspillées. En définissant raisonnablement l'heure du délai d'expiration, vous pouvez fermer la connexion inactive à temps et libérer les ressources système.
Évitez les impasses : les connexions inactives à long terme peuvent entraîner le verrouillage des ressources internes, affectant le traitement normal des autres connexions. La définition du délai d'expiration approprié peut empêcher que cela ne se produise.
Améliorer la stabilité du service : le mécanisme de délai d'expiration peut empêcher le client de répondre pendant longtemps ou de perdre des connexions. Le serveur peut nettoyer les connexions échouées à temps pour assurer la stabilité du service.
La syntaxe de base de la fonction Stream_Set_timeout est la suivante:
<span><span><span class="hljs-keyword">bool</span></span><span> </span><span><span class="hljs-title function_ invoke__">stream_set_timeout</span></span><span> ( resource </span><span><span class="hljs-variable">$stream</span></span><span> , </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$seconds</span></span><span> , </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$microseconds</span></span><span> = </span><span><span class="hljs-number">0</span></span><span> )
</span></span>$ Stream : la ressource Stream qui doit être définie sur le délai d'attente.
$ secondes : l'heure du délai d'expiration, en quelques secondes.
$ microsecondes : paramètre facultatif, définissez la partie microsecondes du délai d'attente.
Dans les services de connexion longs, la définition des délais d'expiration est raisonnablement un problème d'équilibre complexe. Si le délai d'attente est réglé trop court, certaines connexions peuvent être déconnectées car elles sont légèrement insensibles, ce qui augmente les frais généraux de reconnexion; Si le délai d'attente est trop long, les ressources peuvent ne pas être recyclées dans le temps.
Il existe plusieurs stratégies de délai d'expiration:
Pour les longues connexions, il est courant d'envoyer un paquet de «rythme cardiaque» au client dans un certain intervalle de temps pour s'assurer que la connexion est toujours valide. Dans ce cas, le délai d'expiration peut être ajusté dynamiquement en fonction de la réception du paquet de battements cardiaques. Par exemple:
Envoyez un paquet de battements cardiaques toutes les 30 secondes.
Si le paquet de battements cardiaques n'est pas reçu dans les 60 secondes, un délai d'attente est déclenché.
<span><span><span class="hljs-title function_ invoke__">stream_set_timeout</span></span><span>(</span><span><span class="hljs-variable">$stream</span></span><span>, </span><span><span class="hljs-number">60</span></span><span>); </span><span><span class="hljs-comment">// Définir maximum60Timeout si le second n'est pas actif</span></span><span>
</span></span>Si les données traitées par le service de connexion long sont intermittents, il ne peut y avoir aucune opération pendant une période de temps. Pour éviter une utilisation inutile des ressources, un délai d'inactivité peut être défini. Par exemple, défini sur la déconnexion toutes les 5 minutes sans interaction de données:
<span><span><span class="hljs-title function_ invoke__">stream_set_timeout</span></span><span>(</span><span><span class="hljs-variable">$stream</span></span><span>, </span><span><span class="hljs-number">300</span></span><span>); </span><span><span class="hljs-comment">// Définissez l'heure du délai de temps pour la connexion inactive à300Deuxième(5minute)</span></span><span>
</span></span>Dans les applications pratiques, les longues connexions sont non seulement des états "actifs" ou "inactifs", mais aussi des délais d'attention des opérations de lecture et d'écriture de données doivent être prises en compte. Par exemple, lors de la réception de données, le client peut ne pas arriver à temps en raison de l'instabilité du réseau ou de quelques raisons. Dans ce cas, le serveur peut définir un délai de lecture et d'écriture via stream_set_timeout pour éviter de longues attentes:
<span><span><span class="hljs-comment">// Définissez le temps mort lors de la lecture des données sur 5 Deuxième</span></span><span>
</span><span><span class="hljs-title function_ invoke__">stream_set_timeout</span></span><span>(</span><span><span class="hljs-variable">$stream</span></span><span>, </span><span><span class="hljs-number">5</span></span><span>);
</span></span>En définissant le délai d'expiration de lecture et d'écriture, le serveur peut répondre aux demandes échouées en temps opportun et effectuer une réessayer ou une gestion des erreurs appropriée.
Le réglage du délai d'expiration dans les connexions longues doit être utilisé en conjonction avec les mécanismes de gestion des exceptions. Dans PHP, vous pouvez vérifier l'état actuel du flux via Stream_get_Meta_Data et effectuer une gestion des exceptions en combinaison avec la logique de temps mort:
<span><span><span class="hljs-comment">// installation 10 Deuxième超时</span></span><span>
</span><span><span class="hljs-title function_ invoke__">stream_set_timeout</span></span><span>(</span><span><span class="hljs-variable">$stream</span></span><span>, </span><span><span class="hljs-number">10</span></span><span>);
</span><span><span class="hljs-comment">// Lire les données</span></span><span>
</span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fread</span></span><span>(</span><span><span class="hljs-variable">$stream</span></span><span>, </span><span><span class="hljs-number">1024</span></span><span>);
</span><span><span class="hljs-comment">// Obtenez les métadonnées du ruisseau</span></span><span>
</span><span><span class="hljs-variable">$metaData</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_get_meta_data</span></span><span>(</span><span><span class="hljs-variable">$stream</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$metaData</span></span><span>[</span><span><span class="hljs-string">'timed_out'</span></span><span>]) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Délai de connexion\n"</span></span><span>;
</span><span><span class="hljs-comment">// Vous pouvez réessayer ou déconnecter cette opération</span></span><span>
}
</span></span>Choisissez raisonnablement l'heure du délai d'expiration : définissez le temps de délai d'expiration approprié en fonction des besoins spécifiques du service. Si l'interaction des données est fréquente, le temps de temps mort peut être réglé plus court; Si l'interaction est moindre, le délai d'expiration peut être réglé plus longtemps. Évitez de définir des délais d'attente trop courts ou trop longs, ce qui affectera la stabilité et les performances du système.
Nettoyez régulièrement les connexions invalides : vérifiez l'activité de la connexion via le mécanisme de battement de carrie ou du temps opportun pour vous assurer que les connexions qui ne sont pas actives pendant longtemps peuvent être fermées à temps, libérant ainsi les ressources système.
Stratégie de délai d'expiration dans des situations de concurrence élevées : si votre service de connexion long doit gérer des demandes de concurrence élevées, envisagez de définir différents délais de délai pour différents types de demandes et de les ajuster dynamiquement en fonction de la situation réelle.
Combiné avec d'autres mécanismes : la gestion du délai d'expiration doit être utilisée en combinaison avec la gestion des erreurs, le mécanisme de réessayer, l'équilibrage de la charge, etc. pour garantir la haute disponibilité des services à long terme.
stream_set_timeout est une fonction très utile en PHP, en particulier dans les services à long terme. La définition raisonnable du délai d'expiration peut gérer efficacement l'état de la connexion, éviter les déchets de ressources et garantir un service efficace et stable. Dans les applications réelles, la stratégie de délai d'expiration doit être configurée de manière flexible en fonction des besoins du service, et en même temps, combinée au mécanisme de gestion des exceptions pour garantir la vérification et la gestion en temps opportun de l'état de la connexion.