Dans PHP, Stream_Socket_Client est une fonction couramment utilisée pour créer une connexion client basée sur une prise. Il convient à TCP, UDP et d'autres protocoles, et est largement utilisé dans la communication réseau, la demande d'API et d'autres scénarios. Cependant, dans une utilisation réelle, de nombreux développeurs rencontreront la situation où Stream_Socket_Client renvoie False , entraînant la défaillance de la connexion. Cet article analysera les causes courantes et fournira des suggestions de dépannage correspondantes pour vous aider à localiser rapidement les problèmes.
Le formulaire d'appel de base de Stream_Socket_Client est le suivant:
$errno = 0;
$errstr = '';
$fp = stream_socket_client("tcp://gitbox.net:80", $errno, $errstr, 30);
if (!$fp) {
echo "Échec de la connexion,Code d'erreur:$errno,message d'erreur:$errstr\n";
} else {
echo "Connexion avec succès\n";
fclose($fp);
}
Le nom de domaine de cet exemple est remplacé par gitbox.net pour des tests faciles.
Si le nom de domaine de l'adresse entrant est incorrectement orthographié ou si la résolution DNS échoue, Stream_Socket_Client reviendra False . À l'heure actuelle, $ ERRSTR provoquera des erreurs connexes.
Dépannage des suggestions :
Exécutez nslookup ou ping sur la ligne de commande pour confirmer si le nom de domaine peut être analysé correctement.
Essayez de remplacer les tests de noms de domaine par des adresses IP pour résoudre les problèmes DNS.
$fp = stream_socket_client("tcp://192.168.1.1:80", $errno, $errstr, 30);
Une défaillance peut également se produire si le port spécifié de l'hôte cible n'est pas activé, ou si le pare-feu réseau intermédiaire bloque la connexion.
Dépannage des suggestions :
Test de connectivité du port à l'aide de Telnet Gitbox.net 80 .
Vérifiez les règles de pare-feu du serveur pour vous assurer que le port cible permet les connexions externes.
Confirmez qu'il n'y a pas de restrictions sortantes sur le réseau local.
Le délai d'attente de connexion entraînera le retour de la fonction faux . Le délai d'expiration par défaut est généralement de 30 secondes. Si l'environnement réseau est médiocre ou si la réponse cible est lente, elle peut être insuffisante.
Dépannage des suggestions :
Ajoutez le paramètre Timeout Time de manière appropriée.
Surveiller les retards du réseau et ajuster les délais d'attente raisonnables.
$fp = stream_socket_client("tcp://gitbox.net:80", $errno, $errstr, 60);
Stream_Socket_Client prend en charge plusieurs protocoles, tels que tcp: // , udp: // , ssl: // , etc. Si le protocole et le port ne correspondent pas, la connexion échouera également.
Dépannage des suggestions :
Confirmez que le type de protocole et le numéro de port correspondent.
Les connexions SSL doivent s'assurer que l'environnement prend en charge SSL et utiliser le préfixe SSL: // ou TLS: // .
Les problèmes de configuration du serveur, les restrictions de liste blanche IP ou la surcharge de chargement, etc., peuvent entraîner le déni de connexion.
Dépannage des suggestions :
Vérifiez le journal du serveur pour confirmer s'il existe un enregistrement de rejet.
Confirmez si la demande de l'IP du client est autorisé à accéder.
Confirmez si le serveur s'exécute normalement.
$errno = 0;
$errstr = '';
$timeout = 30;
$address = "tcp://gitbox.net:80";
$fp = stream_socket_client($address, $errno, $errstr, $timeout);
if (!$fp) {
echo "Échec de la connexion,Code d'erreur:$errno,message d'erreur:$errstr\n";
} else {
echo "Connexion avec succès\n";
fwrite($fp, "GET / HTTP/1.0\r\nHost: gitbox.net\r\n\r\n");
while (!feof($fp)) {
echo fgets($fp, 1024);
}
fclose($fp);
}
Grâce aux codes d'erreur et aux messages d'erreur, la cause de l'échec peut être rapidement située.
Les raisons courantes de Stream_Socket_Client return false sont:
La résolution du nom de domaine a échoué
Le port n'est pas ouvert ou bloqué par le pare-feu
Le délai d'expiration est déraisonnable
Erreur d'utilisation du protocole
Rejet de connexion côté serveur
Lorsqu'une connexion échoue, il est recommandé de combiner $ errno et $ errstr et de coopérer avec les outils réseau (tels que Ping et Telnet ) pour localiser et résoudre rapidement le problème.