Position actuelle: Accueil> Derniers articles> Comment implémenter la transmission de données de socket en envoyant des données via la fonction FSOCOPEN? Quels sont les conseils?

Comment implémenter la transmission de données de socket en envoyant des données via la fonction FSOCOPEN? Quels sont les conseils?

gitbox 2025-06-21

Dans PHP, la fonction FSOCOPEN est une fonction couramment utilisée pour créer des connexions de socket, qui vous permet de communiquer des données avec des serveurs distants. Avec FSOCCKOpen , vous pouvez implémenter un transfert de données de socket simple, qui est très utile pour les applications qui nécessitent des opérations de réseau de bas niveau. Cet article explorera comment utiliser FSOCOPEN pour implémenter la transmission de données et partager quelques conseils qui peuvent être utilisés pendant l'utilisation.

1. Utilisation de base de la fonction fsocckopen

La fonction FSOCCKOpen est utilisée pour ouvrir une connexion réseau et peut être utilisée pour créer des prises TCP ou UDP. Le prototype de fonction le plus basique est le suivant:

 <span><span>resource </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-keyword">int</span></span><span> &amp;</span><span><span class="hljs-variable">$errno</span></span><span> [, </span><span><span class="hljs-keyword">string</span></span><span> &amp;</span><span><span class="hljs-variable">$errstr</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 : le nom d'hôte de destination ou l'adresse IP.

  • $ port : le numéro de port cible.

  • $ errno et $ errstr : paramètres facultatifs pour capturer les messages d'erreur.

  • $ Timeout : délai de connexion facultatif, en secondes.

Un exemple simple d'utilisation:

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-variable">$host</span></span><span> = </span><span><span class="hljs-string">'www.example.com'</span></span><span>;
</span><span><span class="hljs-variable">$port</span></span><span> = </span><span><span class="hljs-number">80</span></span><span>;
</span><span><span class="hljs-variable">$timeout</span></span><span> = </span><span><span class="hljs-number">30</span></span><span>; </span><span><span class="hljs-comment">// Réglez le temps de temps d&#39;expiration pour 30 Deuxième</span></span><span>

</span><span><span class="hljs-comment">// utiliser fsockopen Établir une connexion</span></span><span>
</span><span><span class="hljs-variable">$socket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fsockopen</span></span><span>(</span><span><span class="hljs-variable">$host</span></span><span>, </span><span><span class="hljs-variable">$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-variable">$timeout</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">echo</span></span><span> </span><span><span class="hljs-string">"erreur: <span class="hljs-subst">$errno</span></span></span><span> - </span><span><span class="hljs-subst">$errstr</span></span><span>&lt;br /&gt;\n";
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Connecté avec succès <span class="hljs-subst">$host</span></span></span><span>:</span><span><span class="hljs-subst">$port</span></span><span>&lt;br /&gt;\n";
    </span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);
}
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

2. Utilisez FSOCOPEN pour la transmission des données

Une fois la connexion établie, vous pouvez démarrer le transfert de données avec le serveur. Pour la communication du protocole HTTP, vous devez généralement envoyer un en-tête de demande et le serveur répondra aux données correspondantes. Voici un exemple de demande HTTP simple:

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-variable">$host</span></span><span> = </span><span><span class="hljs-string">'www.example.com'</span></span><span>;
</span><span><span class="hljs-variable">$port</span></span><span> = </span><span><span class="hljs-number">80</span></span><span>;
</span><span><span class="hljs-variable">$timeout</span></span><span> = </span><span><span class="hljs-number">30</span></span><span>;

</span><span><span class="hljs-variable">$socket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fsockopen</span></span><span>(</span><span><span class="hljs-variable">$host</span></span><span>, </span><span><span class="hljs-variable">$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-variable">$timeout</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">echo</span></span><span> </span><span><span class="hljs-string">"erreur: <span class="hljs-subst">$errno</span></span></span><span> - </span><span><span class="hljs-subst">$errstr</span></span><span>&lt;br /&gt;\n";
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-comment">// Construire HTTP En-tête de demande</span></span><span>
    </span><span><span class="hljs-variable">$request</span></span><span> = </span><span><span class="hljs-string">"GET / HTTP/1.1\r\n"</span></span><span>;
    </span><span><span class="hljs-variable">$request</span></span><span> .= </span><span><span class="hljs-string">"Host: <span class="hljs-subst">$host</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-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">$socket</span></span><span>, </span><span><span class="hljs-variable">$request</span></span><span>);

    </span><span><span class="hljs-comment">// Réponse du serveur de réception et de sortie</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">$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">$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">$socket</span></span><span>);
}
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

Dans le code ci-dessus, nous utilisons FSOCOPEN pour établir la connexion, puis envoyons l'en-tête de demande HTTP au serveur via la fonction FWrite , puis utilisons la fonction FGETS pour lire les données renvoyées par le serveur. Enfin, fermez la connexion de la prise via Fclose .

3. Conseils et précautions courantes

3.1 Set Timeout

Dans la programmation réseau, la définition d'un délai d'expiration raisonnable est très importante, surtout lorsque vous interagissez avec un serveur distant. Le délai d'attente de connexion peut être contrôlé via le paramètre de délai d'expiration de FSOCOPEN . Si le délai d'attente que vous définissez est trop court, il peut entraîner une interruption de connexion prématurée; S'il est trop long, cela peut entraîner la suspension du programme lorsqu'il ne peut pas se connecter. Il est généralement recommandé de définir le délai d'attente dans les 30 secondes.

 <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 temps mort sur 10 Deuxième</span></span><span>
</span></span>

3.2 Gestion des erreurs

La valeur de retour de la fonction fsocckopen est un type de ressource (la poignée de la connexion de socket), et si la connexion échoue, elle renvoie false . Pour éviter les erreurs et les gérer, il est recommandé d'utiliser le code d'erreur $ ERRNO et le message d'erreur $ ERRSTR pour les enregistrements détaillés:

 <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">echo</span></span><span> </span><span><span class="hljs-string">"Échec de la connexion:<span class="hljs-subst">$errno</span></span></span><span> - </span><span><span class="hljs-subst">$errstr</span></span><span>&lt;br /&gt;\n";
    </span><span><span class="hljs-keyword">exit</span></span><span>;
}
</span></span>

3.3 Mode de transmission des données

En plus d'envoyer des demandes HTTP, FSOCOPEN peut également être utilisé pour envoyer des données à partir d'autres protocoles, tels que FTP, SMTP, POP3, etc. Quel que soit le protocole, l'idée principale est d'envoyer des données via FWrite , Fread ou Fgets pour obtenir la réponse. Selon le protocole, le format de données peut changer. Il est recommandé de connaître le format de demande du protocole cible avant d'envoyer les données.

3.4 Connexion persistante

Dans certains cas, il peut être souhaitable de maintenir une connexion à long terme avec le serveur, qui peut être réalisée via des connexions persistantes HTTP (Keep-Alive). En ajoutant de la connexion: Keep-Alive dans l'en-tête de demande, vous pouvez garder la connexion non classée entre plusieurs demandes:

 <span><span><span class="hljs-variable">$request</span></span><span> = </span><span><span class="hljs-string">"GET / HTTP/1.1\r\n"</span></span><span>;
</span><span><span class="hljs-variable">$request</span></span><span> .= </span><span><span class="hljs-string">"Host: <span class="hljs-subst">$host</span></span></span><span>\r\n";
</span><span><span class="hljs-variable">$request</span></span><span> .= </span><span><span class="hljs-string">"Connection: keep-alive\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>

3.5 Utilisation d'un serveur proxy

Parfois, vous devrez peut-être communiquer avec le serveur cible via un serveur proxy. À l'heure actuelle, l'adresse et le port du serveur proxy peuvent être transmis à fsocopen au lieu de se connecter directement au serveur cible:

 <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-variable">$proxyPort</span></span><span> = </span><span><span class="hljs-number">8080</span></span><span>;

</span><span><span class="hljs-variable">$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">$proxyPort</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-variable">$timeout</span></span><span>);
</span></span>

Il convient de noter que le serveur proxy peut nécessiter des informations d'authentification spécifiques (telles que le nom d'utilisateur et le mot de passe), et pour le moment, l'en-tête de demande doit être construit en fonction des exigences du protocole proxy.

4. Résumé

FSOCCKOpen est une fonction très puissante en PHP, adaptée à la communication réseau de bas niveau. Lorsque vous avez besoin d'échanger des données avec des serveurs distants, FSOCOPEN fournit une manière directe et flexible. La maîtrise des méthodes d'utilisation de base, des paramètres de délai d'expiration, des techniques de gestion des erreurs et de transmission des protocoles courants vous aidera à réaliser plus efficacement la transmission des données de socket. Dans les applications pratiques, n'oubliez pas d'ajuster les paramètres en fonction des exigences et d'assurer la stabilité des demandes de réseau.