Dans PHP, FSOCOPEN est une fonction d'ouverture des connexions réseau, qui est souvent utilisée pour créer des connexions de socket, en particulier lors de la connexion à un serveur proxy. La configuration appropriée de FSOCOPEN et de débogage est la clé pour assurer des demandes de réseau en douceur. Cet article présentera comment configurer correctement le serveur proxy de connexion FSOCOPEN et fournir des conseils de débogage pour vous aider à mieux localiser et résoudre les problèmes de connexion.
FSOCCKOpen est utilisé pour ouvrir une connexion réseau et prend en charge la communication avec le serveur via HTTP, HTTPS et d'autres protocoles. La syntaxe de base est la suivante:
<span><span><span class="hljs-title function_ invoke__">fsockopen</span></span><span>(</span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$hostname</span></span><span>, </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$port</span></span><span> = </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-keyword">int</span></span><span> &</span><span><span class="hljs-variable">$errno</span></span><span> = </span><span><span class="hljs-literal">null</span></span><span>, </span><span><span class="hljs-keyword">string</span></span><span> &</span><span><span class="hljs-variable">$errstr</span></span><span> = </span><span><span class="hljs-literal">null</span></span><span>, </span><span><span class="hljs-keyword">float</span></span><span> </span><span><span class="hljs-variable">$timeout</span></span><span> = </span><span><span class="hljs-title function_ invoke__">ini_get</span></span><span>(</span><span><span class="hljs-string">"default_socket_timeout"</span></span><span>))
</span></span>
$ hostname : l'adresse de l'hôte cible ou l'adresse du serveur proxy.
$ Port : le numéro de port du serveur cible, le HTTP par défaut est de 80 et le HTTPS par défaut est 443.
$ errno : code d'erreur pour l'erreur de connexion.
$ errstr : message d'erreur.
$ Timeout : délai de connexion, secondes unitaires.
Pour nous connecter à l'hôte cible via un serveur proxy, nous devons d'abord établir une connexion via l'adresse IP et le port du serveur proxy. D'une manière générale, un serveur proxy vous obligera à fournir des informations d'authentification spécifiques (telles que le nom d'utilisateur et le mot de passe), vous devez donc assurer l'exactitude des paramètres de proxy.
Voici un exemple simple montrant comment se connecter à un hôte distant via un serveur proxy:
<span><span><span class="hljs-variable">$proxy</span></span><span> = </span><span><span class="hljs-string">'proxy.example.com'</span></span><span>; </span><span><span class="hljs-comment">// Adresse du serveur proxy</span></span><span>
</span><span><span class="hljs-variable">$proxy_port</span></span><span> = </span><span><span class="hljs-number">8080</span></span><span>; </span><span><span class="hljs-comment">// Port proxy</span></span><span>
</span><span><span class="hljs-variable">$target</span></span><span> = </span><span><span class="hljs-string">'example.com'</span></span><span>; </span><span><span class="hljs-comment">// Hôte cible</span></span><span>
</span><span><span class="hljs-variable">$target_port</span></span><span> = </span><span><span class="hljs-number">80</span></span><span>; </span><span><span class="hljs-comment">// Port cible</span></span><span>
</span><span><span class="hljs-comment">// Connectez-vous à un serveur proxy</span></span><span>
</span><span><span class="hljs-variable">$proxy_socket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fsockopen</span></span><span>(</span><span><span class="hljs-variable">$proxy</span></span><span>, </span><span><span class="hljs-variable">$proxy_port</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">$proxy_socket</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"无法Connectez-vous à un serveur proxy: <span class="hljs-subst">$errstr</span></span></span><span> (</span><span><span class="hljs-subst">$errno</span></span><span>)\n";
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-comment">// Envoyer une demande de proxy</span></span><span>
</span><span><span class="hljs-variable">$request</span></span><span> = </span><span><span class="hljs-string">"GET http://<span class="hljs-subst">$target</span></span></span><span>/ HTTP/1.1\r\n";
</span><span><span class="hljs-variable">$request</span></span><span> .= </span><span><span class="hljs-string">"Host: <span class="hljs-subst">$target</span></span></span><span>\r\n";
</span><span><span class="hljs-variable">$request</span></span><span> .= </span><span><span class="hljs-string">"Connection: Close\r\n"</span></span><span>;
</span><span><span class="hljs-variable">$request</span></span><span> .= </span><span><span class="hljs-string">"\r\n"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">fwrite</span></span><span>(</span><span><span class="hljs-variable">$proxy_socket</span></span><span>, </span><span><span class="hljs-variable">$request</span></span><span>);
</span><span><span class="hljs-comment">// Obtenez la réponse du serveur proxy</span></span><span>
</span><span><span class="hljs-keyword">while</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">feof</span></span><span>(</span><span><span class="hljs-variable">$proxy_socket</span></span><span>)) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">fgets</span></span><span>(</span><span><span class="hljs-variable">$proxy_socket</span></span><span>, </span><span><span class="hljs-number">128</span></span><span>);
}
</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$proxy_socket</span></span><span>);
}
</span></span>
Si le serveur proxy nécessite une authentification, vous devez fournir les informations d'authentification correspondantes lors de l'envoi de la demande. En règle générale, l'authentification proxy utilise l'authentification de base ou d'autres mécanismes d'authentification.
L'authentification de base peut être obtenue en utilisant l'en-tête d'autorisation :
<span><span><span class="hljs-variable">$username</span></span><span> = </span><span><span class="hljs-string">'my_username'</span></span><span>;
</span><span><span class="hljs-variable">$password</span></span><span> = </span><span><span class="hljs-string">'my_password'</span></span><span>;
</span><span><span class="hljs-comment">// Faire du nom d'utilisateur et du mot de passe Base64 codage</span></span><span>
</span><span><span class="hljs-variable">$auth</span></span><span> = </span><span><span class="hljs-title function_ invoke__">base64_encode</span></span><span>(</span><span><span class="hljs-string">"<span class="hljs-subst">$username</span></span></span><span>:</span><span><span class="hljs-subst">$password</span></span><span>");
</span><span><span class="hljs-variable">$request</span></span><span> = </span><span><span class="hljs-string">"GET http://<span class="hljs-subst">$target</span></span></span><span>/ HTTP/1.1\r\n";
</span><span><span class="hljs-variable">$request</span></span><span> .= </span><span><span class="hljs-string">"Host: <span class="hljs-subst">$target</span></span></span><span>\r\n";
</span><span><span class="hljs-variable">$request</span></span><span> .= </span><span><span class="hljs-string">"Connection: Close\r\n"</span></span><span>;
</span><span><span class="hljs-variable">$request</span></span><span> .= </span><span><span class="hljs-string">"Proxy-Authorization: Basic <span class="hljs-subst">$auth</span></span></span><span>\r\n";
</span><span><span class="hljs-variable">$request</span></span><span> .= </span><span><span class="hljs-string">"\r\n"</span></span><span>;
</span><span><span class="hljs-comment">// Envoyer une demande</span></span><span>
</span><span><span class="hljs-title function_ invoke__">fwrite</span></span><span>(</span><span><span class="hljs-variable">$proxy_socket</span></span><span>, </span><span><span class="hljs-variable">$request</span></span><span>);
</span></span>
Vérifiez la connexion du serveur proxy <br> Si vous rencontrez une situation où vous ne pouvez pas vous connecter à un serveur proxy, vérifiez d'abord si le serveur proxy est accessible. Vous pouvez utiliser des outils de ligne de commande tels que Ping ou Telnet pour tester si la connexion est normale. Par exemple:
<span><span>ping proxy.example.com
telnet proxy.example.com 8080
</span></span>
Informations de débogage d'impression <br> Dans PHP, vous pouvez utiliser var_dump ou echo pour imprimer le contenu de la demande et de la réponse pour vous aider à déboguer si la demande de proxy est envoyée normalement. Vous pouvez également vérifier les messages d'erreur inattendus ou le contenu de réponse.
<span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Demande envoyée:\n"</span></span><span> . </span><span><span class="hljs-variable">$request</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Contenu de réponse:\n"</span></span><span>;
</span></span>
Définir un délai d'expiration raisonnable <br> Si le temps de connexion est trop long, le délai d'expiration peut être correctement augmenté ou diminué. Un délai excessivement longtemps peut entraîner le retrait de la demande, tandis qu'un délai excessivement court peut entraîner l'échec de la connexion en raison du retard du réseau.
<span><span><span class="hljs-variable">$timeout</span></span><span> = </span><span><span class="hljs-number">10</span></span><span>; </span><span><span class="hljs-comment">// Définissez le délai de connexion sur 10 Deuxième</span></span><span>
</span></span>
Vérifier le journal du serveur proxy <br> Si vous ne trouvez pas le problème directement à partir du code PHP, la vérification des fichiers journaux du serveur proxy est un bon moyen de le faire. Un serveur proxy enregistre généralement les détails de la demande, y compris si la connexion est réussie, si l'authentification est requise, etc.
Utilisez Stream_Socket_Client au lieu de fsocckopen
Si vous souhaitez gérer les connexions et les flux de données de manière plus flexible, vous pouvez utiliser Stream_Socket_Client au lieu de FSOCCKOpen , qui prend en charge les paramètres de paramètres plus riches et peut mieux gérer les demandes de réseau complexes.
Exemple:
<span><span><span class="hljs-variable">$context</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_context_create</span></span><span>([
</span><span><span class="hljs-string">'http'</span></span><span> => [
</span><span><span class="hljs-string">'proxy'</span></span><span> => </span><span><span class="hljs-string">'tcp://proxy.example.com:8080'</span></span><span>,
</span><span><span class="hljs-string">'request_fulluri'</span></span><span> => </span><span><span class="hljs-literal">true</span></span><span>,
]
]);
</span><span><span class="hljs-variable">$file</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-string">'http://example.com'</span></span><span>, </span><span><span class="hljs-string">'r'</span></span><span>, </span><span><span class="hljs-literal">false</span></span><span>, </span><span><span class="hljs-variable">$context</span></span><span>);
</span></span>
Délai d'expiration de la connexion proxy <br> Les délais de connexion sont généralement liés aux conditions du réseau ou à la configuration du serveur proxy. Ce problème peut être résolu en augmentant le délai d'expiration ou en remplaçant un autre serveur proxy.
L'authentification de l'agent a échoué <br> Assurez-vous que vos informations d'authentification sont correctes, en particulier le codage de base64 du nom d'utilisateur et du mot de passe. Si vous utilisez d'autres types d'authentification (tels que NTLM ou Digest), vous avez besoin de bibliothèques d'assistance supplémentaires ou d'approches plus complexes pour le gérer.
Le contenu de la réponse est vide ou le format est incorrect <br> Cette situation peut être due au serveur proxy ne transmettant pas correctement la demande, ou le serveur cible n'est pas accessible via le proxy. Vous pouvez utiliser le journal de débogage du serveur proxy ou utiliser d'autres outils réseau tels que Postman pour vérifier le comportement du serveur proxy.