<span><span>Warning: stream_socket_server(): unable to bind to tcp://127.0.0.1:8080 (Reason: Address already in use) in ...
</span></span>
Cette erreur se produit généralement lorsque vous essayez d'utiliser Stream_Socket_Server pour se lier à un port ou une adresse qui a été occupé par d'autres programmes. Il y a deux solutions:
Vérifiez si le port est occupé: utilisez la commande netstat -tuln (Linux) ou LSOF -I: 8080 pour vérifier si le port a été occupé par d'autres applications.
Sélectionnez un autre port: si le port est occupé, sélectionnez un port inutilisé ou arrêtez le service qui occupe ce port.
<span><span>Warning: stream_socket_server(): unable to create socket resource in ...
</span></span>
Cette erreur peut être liée aux restrictions du système ou aux problèmes d'autorisation. Les raisons courantes sont:
Autorisations insuffisantes: dans les systèmes Linux, les autorisations racine sont nécessaires pour se lier aux ports inférieurs à 1024. La solution consiste à utiliser un numéro de port plus élevé ou à exécuter le script avec les privilèges de l'administrateur.
Limite de ressources système: le système peut avoir une limite sur le nombre de descripteurs de fichiers à ouvrir. Vous pouvez afficher la limite actuelle via la commande ulimit -n et augmenter la limite via ulimit -n <umber> .
<span><span>Warning: stream_socket_accept(): unable to accept connection in ...
</span></span>
Si vous avez créé avec succès la ressource du serveur mais que vous ne pouvez toujours pas accepter la connexion, ce peut être les raisons suivantes:
Problème de configuration du réseau: assurez-vous que l'adresse et le port que vous liez sont corrects et que le réseau est connecté. S'il s'agit d'un environnement de développement local, assurez-vous qu'il n'y a pas de pare-feu bloquant le port.
Problème de blocage: par défaut, Stream_Socket_Server est une fonction de blocage. Si aucune connexion ne vient, il attendra. Vous pouvez utiliser le mode non bloquant pour éviter ce problème:
<span><span><span class="hljs-variable">$server</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_socket_server</span></span><span>(</span><span><span class="hljs-string">"tcp://127.0.0.1:8080"</span></span><span>, </span><span><span class="hljs-variable">$errno</span></span><span>, </span><span><span class="hljs-variable">$errstr</span></span><span>, STREAM_SERVER_BIND | STREAM_SERVER_LISTEN);
</span><span><span class="hljs-title function_ invoke__">stream_set_blocking</span></span><span>(</span><span><span class="hljs-variable">$server</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>);
</span></span>
De cette façon, le programme peut continuer à s'exécuter même s'il n'y a pas de connexion.
<span><span>Warning: stream_socket_accept(): connection reset by peer in ...
</span></span>
Cette erreur est généralement lorsque le client ferme la connexion immédiatement après la connexion ou a une défaillance du réseau. Vous pouvez le résoudre par:
Capturez les événements de clôture des connexions: lors de la gestion des connexions du client, les exceptions doivent être gérées et s'assurer que les ressources sont libérées après la fermeture de la connexion:
<span><span><span class="hljs-variable">$client</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_socket_accept</span></span><span>(</span><span><span class="hljs-variable">$server</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$client</span></span><span>) {
</span><span><span class="hljs-comment">// Connexions de traitement</span></span><span>
</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$client</span></span><span>); </span><span><span class="hljs-comment">// Assurez-vous de fermer la connexion</span></span><span>
}
</span></span>
Assurez-vous la stabilité du client: confirmez si le client ferme la connexion en raison d'une erreur ou d'une raison inattendue. Vous pouvez afficher les interactions réseau entre les clients et les serveurs via des outils de capture de paquets réseau (tels que Wireshark) pour résoudre les problèmes de réseau.
<span><span>Warning: stream_socket_recvfrom(): unable to read from socket resource in ...
</span></span>
Cette erreur se produit généralement lorsque vous essayez de lire les données du client, ce qui peut être dû au fait que le client n'envoie pas les données ou a fermé la connexion. La solution est la suivante:
Vérifiez le comportement du client: assurez-vous que le client envoie des données et ne ferme pas la connexion à l'avance après avoir envoyé les données.
Augmenter le délai de lecture: si vous vous attendez à ce que le client envoie des données tôt ou tard, vous pouvez définir le délai de lecture:
<span><span><span class="hljs-title function_ invoke__">stream_set_timeout</span></span><span>(</span><span><span class="hljs-variable">$client</span></span><span>, </span><span><span class="hljs-number">10</span></span><span>); </span><span><span class="hljs-comment">// 10Deuxième délai</span></span><span>
</span></span>
<span><span>Warning: stream_socket_server(): SSL operation failed with code 1. OpenSSL Error messages:
error:1408F119:SSL routines:SSL3_GET_RECORD:decryption failed or bad record mac in ...
</span></span>
Lorsque vous activez SSL dans Stream_Socket_Server , vous pouvez rencontrer des erreurs liées à SSL / TLS. Les raisons courantes sont:
Problème de certificat: assurez-vous de fournir le bon certificat SSL et le fichier de clé privée et que le chemin du fichier est correct.
Problème de configuration OpenSSL: Assurez-vous que votre installation PHP contient l'extension OpenSSL et la prise en charge SSL est activée dans le fichier de configuration PHP (PHP.ini).
<span><span><span class="hljs-variable">$server</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_socket_server</span></span><span>(</span><span><span class="hljs-string">"ssl://127.0.0.1:443"</span></span><span>, </span><span><span class="hljs-variable">$errno</span></span><span>, </span><span><span class="hljs-variable">$errstr</span></span><span>, STREAM_SERVER_BIND | STREAM_SERVER_LISTEN, </span><span><span class="hljs-title function_ invoke__">stream_context_create</span></span><span>([
</span><span><span class="hljs-string">'ssl'</span></span><span> => [
</span><span><span class="hljs-string">'local_cert'</span></span><span> => </span><span><span class="hljs-string">'/path/to/cert.pem'</span></span><span>,
</span><span><span class="hljs-string">'local_pk'</span></span><span> => </span><span><span class="hljs-string">'/path/to/private.key'</span></span><span>,
</span><span><span class="hljs-string">'verify_peer'</span></span><span> => </span><span><span class="hljs-literal">false</span></span><span>,
]
]));
</span></span>
De plus, vous pouvez également vérifier la version OpenSSL de PHP pour vous assurer qu'elle prend en charge le protocole de chiffrement dont vous avez besoin.