Dans PHP, la fonction SOCKET_LISTEN est utilisée pour définir une prise créée pour écouter, afin que la prise peut recevoir des demandes de connexion entrantes. Habituellement, cette fonction sera utilisée avec socket_create et socket_bind pour créer une prise de serveur complète pour gérer les demandes du client. Cet article analysera en détail l'utilisation de la fonction Socket_Listen et vous guidera sur la façon d'activer correctement l'écoute.
<span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-title function_ invoke__">socket_listen</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">$backlog</span></span><span> = </span><span><span class="hljs-number">0</span></span><span> )
</span></span>
$ socket : la ressource de socket qui a été créée via socket_create et liée à l'adresse et au port via socket_bind .
$ backlog : spécifie le nombre maximum de demandes de connexion en attente. Il définit les longueurs de file d'attente des connexions non transformées autorisées par le noyau du système d'exploitation. Si la file d'attente est pleine, une nouvelle demande de connexion sera refusée. La valeur commune est de 128 , mais elle peut être ajustée en fonction des exigences.
Lorsque vous réussissez, retournez 0 .
En cas de défaillance, false est renvoyé et les informations d'erreur peuvent être obtenues via socket_last_error () .
Pour utiliser Socket_Listen , vous devez généralement créer une prise via Socket_Create et la lier à l'adresse IP spécifiée et au port avec socket_bind . Ensuite, vous pouvez utiliser socket_listeten pour faire commencer à écouter cette prise à écouter les demandes de connexion du client. Voici un exemple de serveur de base:
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// créerTCPPrises</span></span><span>
</span><span><span class="hljs-variable">$socket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_create</span></span><span>(AF_INET, SOCK_STREAM, SOL_TCP);
</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-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"无法créerPrises: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">socket_strerror</span></span><span>(</span><span><span class="hljs-title function_ invoke__">socket_last_error</span></span><span>()) . </span><span><span class="hljs-string">"\n"</span></span><span>;
</span><span><span class="hljs-keyword">exit</span></span><span>();
}
</span><span><span class="hljs-comment">// Se lier auIPAdresse et port</span></span><span>
</span><span><span class="hljs-variable">$address</span></span><span> = </span><span><span class="hljs-string">'127.0.0.1'</span></span><span>;
</span><span><span class="hljs-variable">$port</span></span><span> = </span><span><span class="hljs-number">8080</span></span><span>;
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_bind</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-variable">$address</span></span><span>, </span><span><span class="hljs-variable">$port</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$result</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"La reliure a échoué: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">socket_strerror</span></span><span>(</span><span><span class="hljs-title function_ invoke__">socket_last_error</span></span><span>()) . </span><span><span class="hljs-string">"\n"</span></span><span>;
</span><span><span class="hljs-keyword">exit</span></span><span>();
}
</span><span><span class="hljs-comment">// 开始监听Prises</span></span><span>
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_listen</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-number">5</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$result</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"L'écoute a échoué: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">socket_strerror</span></span><span>(</span><span><span class="hljs-title function_ invoke__">socket_last_error</span></span><span>()) . </span><span><span class="hljs-string">"\n"</span></span><span>;
</span><span><span class="hljs-keyword">exit</span></span><span>();
}
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Le serveur écoute <span class="hljs-subst">$address</span></span></span><span>:</span><span><span class="hljs-subst">$port</span></span><span>...\n";
</span><span><span class="hljs-comment">// Recevoir une connexion</span></span><span>
</span><span><span class="hljs-variable">$clientSocket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_accept</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$clientSocket</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Recevoir une connexion失败: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">socket_strerror</span></span><span>(</span><span><span class="hljs-title function_ invoke__">socket_last_error</span></span><span>()) . </span><span><span class="hljs-string">"\n"</span></span><span>;
</span><span><span class="hljs-keyword">exit</span></span><span>();
}
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Le client est connecté\n"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">socket_close</span></span><span>(</span><span><span class="hljs-variable">$clientSocket</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">socket_close</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
Dans cet exemple:
Créez une prise TCP via socket_create .
Utilisez Socket_Bind pour lier la prise à 127.0.0.1:8080 , c'est-à-dire le port 8080 de l'adresse locale.
Appelez Socket_Listen pour commencer à écouter la demande de connexion, et le deuxième paramètre 5 indique le nombre maximum de connexions non transformées autorisées.
Utilisez socket_accept pour accepter une connexion du client.
Le deuxième arriéré de paramètre de Socket_Listen spécifie la longueur de la file d'attente de connexion dans le noyau. Cette file d'attente stocke les connexions qui n'ont pas été acceptées par socket_accept . Il convient de noter que ce paramètre n'est pas aussi grand que possible. Bien que des valeurs plus élevées puissent être définies pour s'adapter à plus de connexions d'attente, cela peut également prendre plus de ressources système et peut entraîner un gaspillage de ressources si les paramètres sont trop importants pour ne pas avoir de puissance de traitement.
128 : Il s'agit d'une valeur par défaut courante et convient à la plupart des scénarios d'application.
0 : Si il est défini sur 0 , le système utilisera la longueur de file d'attente par défaut. D'une manière générale, il n'est pas nécessaire de s'inquiéter de la valeur 0 .
Lors de la programmation d'un réseau, les erreurs sont inévitables. Socket_Listeten reviendra False en cas de défaillance. Vous pouvez utiliser socket_last_error pour obtenir des informations d'erreur détaillées pour un débogage facile. Par exemple:
<span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$result</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-variable">$errorCode</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_last_error</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">"L'écoute a échoué, Code d'erreur: <span class="hljs-subst">$errorCode</span></span></span><span>, message d'erreur: " . </span><span><span class="hljs-title function_ invoke__">socket_strerror</span></span><span>(</span><span><span class="hljs-variable">$errorCode</span></span><span>) . </span><span><span class="hljs-string">"\n"</span></span><span>;
}
</span></span>
Ce code renverra des informations d'erreur plus détaillées pour vous aider à résoudre les problèmes.
Mode non bloquant : si vous souhaitez que le socket ne bloque pas le programme pendant l'écoute, vous pouvez utiliser la fonction SOGKET_SET_NONBLOCK pour définir la prise sur le mode non bloquant.
Multithread / multi-processus : Lorsque vous traitez un grand nombre de connexions simultanées, vous pouvez envisager d'utiliser un modèle multi-processus ou multi-thread (comme via PCNTL_FORK ou Extension Pthreads ) afin de gérer plusieurs connexions client sans bloquer le thread principal.
Nettoyage : Après avoir utilisé la prise, n'oubliez pas d'appeler Socket_Close pour fermer la prise et libérer les ressources.
Socket_Listen est une fonction très importante dans la programmation de socket PHP. Il est responsable de la définition de la prise liée pour écouter et en attendant que le client se connecte. L'utilisation correcte de Socket_Listen peut permettre à votre application PHP de gérer les demandes de connexion du client et de fournir des services réseau stables. Assurez-vous que les paramètres de l'arriéré sont correctement définis et que les erreurs sont gérées correctement, ce qui peut améliorer efficacement la fiabilité et la stabilité de l'application.