Position actuelle: Accueil> Derniers articles> Dans quels scénarios communs, Stream_Socket_Shutdown convient pour fermer les connexions de socket PHP?

Dans quels scénarios communs, Stream_Socket_Shutdown convient pour fermer les connexions de socket PHP?

M66 2025-06-22

Dans PHP, il existe de nombreuses façons de fermer la connexion lors de l'utilisation de sockets pour la communication réseau. Parmi eux, la fonction Stream_Socket_Shutdown est une manière courante, ce qui permet aux développeurs de contrôler plus granulé du processus d'arrêt du socket. Comprendre le rôle de Stream_Socket_Shutdown et ses scénarios applicables est crucial pour améliorer la robustesse et les performances du code.

Qu'est-ce que Stream_Socket_Shutdown ?

Stream_Socket_Shutdown est une méthode utilisée dans PHP pour fermer les connexions de socket. Contrairement à simple fclose () ou socket_close () , il offre plus d'options de contrôle, permettant aux développeurs de choisir de fermer les opérations de lecture et d'écriture, ou de fermer complètement la connexion. Le prototype de fonction est le suivant:

 <span><span><span class="hljs-keyword">bool</span></span><span> </span><span><span class="hljs-title function_ invoke__">stream_socket_shutdown</span></span><span>(resource </span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$how</span></span><span>);
</span></span>
  • $ socket : représente la ressource de socket à fermer.

  • $ comment : contrôle le type d'opération qui est fermé. Cela peut être le suivant:

    • Stream_shut_rd : éteignez uniquement l'opération de lecture et conservez la fonction d'écriture.

    • Stream_shut_wr : désactivez uniquement l'opération d'écriture et maintenez la fonction de lecture.

    • Stream_shut_rdwr : ferme simultanément les opérations de lecture et d'écriture, et ferme complètement la connexion.

Scénarios applicables

1. Éteignez l'opération d'écriture pendant la communication à sens unique

Dans certains scénarios d'application, le client ou le serveur n'a plus besoin d'écrire après avoir envoyé des données, mais attendez que l'autre partie réponde. Par exemple, une fois la demande HTTP terminée, le client n'envoie plus de données, mais doit seulement attendre que le serveur renvoie une réponse. À l'heure actuelle, vous pouvez utiliser Stream_Socket_Shutdown pour fermer l'opération d'écriture, réduire la consommation de ressources et améliorer les performances.

Exemple de code:

 <span><span><span class="hljs-variable">$socket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_socket_client</span></span><span>(</span><span><span class="hljs-string">"tcp://example.com:80"</span></span><span>);

</span><span><span class="hljs-title function_ invoke__">fwrite</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-string">"GET / HTTP/1.1\r\nHost: example.com\r\n\r\n"</span></span><span>);

</span><span><span class="hljs-comment">// Fermez l&#39;opération d&#39;écriture après avoir envoyé la demande,Plus de données envoyées</span></span><span>
</span><span><span class="hljs-title function_ invoke__">stream_socket_shutdown</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, STREAM_SHUT_WR);

</span><span><span class="hljs-comment">// Lire la réponse du serveur</span></span><span>
</span><span><span class="hljs-variable">$response</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fread</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-number">1024</span></span><span>);

</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);
</span></span>

Dans cet exemple, le client a envoyé la demande HTTP et n'a plus besoin d'écrire de données sur le serveur, de sorte que l'opération d'écriture est fermée en appelant Stream_Socket_Shutdown .

2. Éteignez l'opération d'écriture lors de la lecture des données

Dans certaines applications, le client ou le serveur peut seulement avoir besoin de lire les données de l'autre partie et de ne plus envoyer de données. À l'heure actuelle, vous pouvez utiliser Stream_Socket_Shutdown pour fermer l'opération d'écriture pour vous assurer que la connexion ne consomme plus de ressources d'écriture inutiles. Par exemple, dans certains modes du protocole FTP, les clients et les serveurs ne doivent lire que des données sans écrire.

Exemple de code:

 <span><span><span class="hljs-variable">$socket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_socket_client</span></span><span>(</span><span><span class="hljs-string">"tcp://example.com:21"</span></span><span>);

</span><span><span class="hljs-title function_ invoke__">fwrite</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-string">"USER anonymous\r\n"</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">fwrite</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-string">"PASS anonymous\r\n"</span></span><span>);

</span><span><span class="hljs-comment">// Plus de données envoyées,Fermez l&#39;opération d&#39;écriture</span></span><span>
</span><span><span class="hljs-title function_ invoke__">stream_socket_shutdown</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, STREAM_SHUT_WR);

</span><span><span class="hljs-comment">// Lisez la réponse renvoyée par le serveur</span></span><span>
</span><span><span class="hljs-variable">$response</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fread</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-number">1024</span></span><span>);

</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);
</span></span>

En désactivant l'opération d'écriture, l'utilisation inutile des ressources peut être réduite et le processus de communication peut être assuré d'être plus efficace.

3. Connexion fermée une fois la communication bidirectionnelle terminée

Pour certaines applications qui nécessitent une communication bidirectionnelle, telles que les systèmes de chat en direct ou les jeux en ligne, ils appellent généralement Stream_Socket_Shutdown après avoir terminé l'échange de données du côté client ou du serveur pour fermer complètement la connexion et libérer toutes les ressources connexes. Utilisez Stream_SHUT_RDWR pour fermer la connexion, en vous assurant que les opérations de lecture et d'écriture sont correctement terminées.

Exemple de code:

 <span><span><span class="hljs-variable">$socket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_socket_client</span></span><span>(</span><span><span class="hljs-string">"tcp://example.com:12345"</span></span><span>);

</span><span><span class="hljs-comment">// Effectuer un échange de données bidirectionnel</span></span><span>
</span><span><span class="hljs-title function_ invoke__">fwrite</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-string">"Hello Server!"</span></span><span>);
</span><span><span class="hljs-variable">$response</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fread</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-number">1024</span></span><span>);

</span><span><span class="hljs-comment">// Fermez complètement la connexion après avoir terminé la communication bidirectionnelle</span></span><span>
</span><span><span class="hljs-title function_ invoke__">stream_socket_shutdown</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, STREAM_SHUT_RDWR);

</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);
</span></span>

À l'heure actuelle, les deux parties n'ont plus besoin de poursuivre la communication. Appelez Stream_Socket_Shutdown pour fermer les opérations de lecture et d'écriture pour s'assurer que la connexion du socket est complètement fermée.

4. Interruption du réseau ou gestion des erreurs

Dans certains cas particuliers, la connexion réseau peut être fermée en raison d'une interruption ou d'une erreur anormale. Utilisez Stream_Socket_Shutdown pour contrôler le processus d'arrêt du socket plus granulant. Par exemple, si une interruption de réseau ou une exception d'application se produit, l'opération de lecture ou d'écriture peut être éteinte éventuellement pour éviter une occupation continue des ressources.

Exemple de code:

 <span><span><span class="hljs-variable">$socket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_socket_client</span></span><span>(</span><span><span class="hljs-string">"tcp://example.com:80"</span></span><span>);

</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-variable">$socket</span></span><span>) {
    </span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"Unable to connect to server"</span></span><span>);
}

</span><span><span class="hljs-comment">// Supposer que certaines erreurs se produisent,Arrêtez d&#39;écrire des données</span></span><span>
</span><span><span class="hljs-title function_ invoke__">stream_socket_shutdown</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, STREAM_SHUT_WR);

</span><span><span class="hljs-comment">// Continuez à lire le message d&#39;erreur ou à informer l&#39;utilisateur</span></span><span>
</span><span><span class="hljs-variable">$response</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fread</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-number">1024</span></span><span>);

</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);
</span></span>

Ici, lorsqu'une exception ou une erreur se produit, nous évitons d'autres tentatives d'écriture de données pour atténuer l'impact sur le serveur en fermant l'opération d'écriture.

5. Mettez en œuvre le mécanisme du délai d'expiration

Certaines applications peuvent avoir besoin de mettre en œuvre un mécanisme de délai d'expiration, c'est-à-dire la fermeture active de la connexion de socket lorsque la connexion ne répond pas pendant longtemps. Dans ce cas, Stream_Socket_Shutdown peut être utilisé pour clôturer les connexions qui ne sont plus nécessaires, évitant ainsi d'attendre des blocages ou une occupation à long terme des ressources du réseau.

Exemple de code:

 <span><span><span class="hljs-variable">$socket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_socket_client</span></span><span>(</span><span><span class="hljs-string">"tcp://example.com:80"</span></span><span>, </span><span><span class="hljs-variable">$errno</span></span><span>, </span><span><span class="hljs-variable">$errstr</span></span><span>, </span><span><span class="hljs-number">30</span></span><span>);

</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-variable">$socket</span></span><span>) {
    </span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"Unable to connect: <span class="hljs-subst">$errstr</span></span></span><span> (</span><span><span class="hljs-subst">$errno</span></span><span>)");
}

</span><span><span class="hljs-comment">// Définir le mécanisme de délai,Fermez la connexion après le temps mort</span></span><span>
</span><span><span class="hljs-title function_ invoke__">stream_set_timeout</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-number">10</span></span><span>); </span><span><span class="hljs-comment">// Réglez le temps de temps d&#39;expiration pour10Deuxième</span></span><span>
</span><span><span class="hljs-variable">$response</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fread</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-number">1024</span></span><span>);

</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">feof</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>)) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Connection timed out or completed.\n"</span></span><span>;
    </span><span><span class="hljs-title function_ invoke__">stream_socket_shutdown</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, STREAM_SHUT_RDWR);
}

</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);
</span></span>

Dans cet exemple, si la connexion ne répond pas dans les 10 secondes, Stream_Socket_Shutdown sera appelée pour fermer la connexion.

Résumer

Stream_Socket_Shutdown est une fonction très utile en PHP qui fournit un contrôle à grain fin sur la fermeture de la connexion à socket. Il convient à une variété de scénarios, notamment la fermeture des opérations d'écriture pendant la communication à sens unique, la fermeture des connexions après la communication bidirectionnelle, la gestion des exceptions du réseau, etc. Comprendre comment il est utilisé peut aider les développeurs à gérer plus efficacement les ressources du réseau et à améliorer la stabilité et les performances des applications.