<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// Ce document est à des fins d'enseignement,Montrer comment PHP Utilisé dans socket_select Vérifier plusieurs Socket Est-ce lisible。</span></span><span>
</span><span><span class="hljs-comment">// Veuillez vous assurer qu'il est activé sockets Étendu。</span></span><span>
</span><span><span class="hljs-comment">// Créer un exemple sockets(serveur socket et plusieurs clients socket),Omettre le processus de création pour se concentrer sur la logique de base。</span></span><span>
</span><span><span class="hljs-comment">// -------------------------------</span></span><span>
</span><span><span class="hljs-meta">?></span></span><span>
</span><span><span class="hljs-comment"># Comment l'utiliser socket_select Vérifier plusieurs Socket Est-ce lisible?PHP Explication des compétences pratiques</span></span><span>
Développement de communications basées sur le réseau PHP Lors de l'application,Nous devons souvent traiter plusieurs connexions en même temps,Surtout quand construire des salles de chat、游戏serveur或即时通信系统等场景中。À ce moment-là,`</span><span><span class="hljs-title function_ invoke__">socket_select</span></span><span>()` Les fonctions sont particulièrement importantes。Il vous permet d'aller en plusieurs socket Des vérifications de lecture non bloquantes sont effectuées entre,Améliorer considérablement l'efficacité。
Cet article vous donnera une compréhension approfondie de la façon de l'utiliser `socket_select` Vérifier plusieurs socket Est-ce lisible,Et donnez un exemple simple et pratique。
</span><span><span class="hljs-comment">## Qu'est-ce que socket_select?</span></span><span>
`</span><span><span class="hljs-title function_ invoke__">socket_select</span></span><span>()` Oui PHP En bas `</span><span><span class="hljs-title function_ invoke__">select</span></span><span>()` Encapsulation des appels système。Il est utilisé pour détecter un ensemble de sockets Oui否可以进行读、Écriture ou opération d'exception,Et le délai d'expiration peut être réglé。
```php
</span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-title function_ invoke__">socket_select</span></span><span>(</span><span><span class="hljs-keyword">array</span></span><span> &</span><span><span class="hljs-variable">$read</span></span><span>, </span><span><span class="hljs-keyword">array</span></span><span> &</span><span><span class="hljs-variable">$write</span></span><span>, </span><span><span class="hljs-keyword">array</span></span><span> &</span><span><span class="hljs-variable">$except</span></span><span>, </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$tv_sec</span></span><span>, </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$tv_usec</span></span><span> = </span><span><span class="hljs-number">0</span></span><span>)
</span></span>$ Read : Sockets que vous souhaitez surveiller s'ils sont lisibles.
$ write : vous souhaitez surveiller si les sockets (null peut être passé).
$ Sauf : vous souhaitez surveiller s'il existe des sockets d'exception (peut passer null).
$ TV_SEC et $ TV_USEC : sont respectivement le délai d'expiration des secondes et des microsecondes.
Voici un extrait de code PHP qui utilise réellement Socket_Select , qui vérifie si plusieurs sockets clients sont arrivés des données:
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 创建主serveur socket</span></span><span>
</span><span><span class="hljs-variable">$server</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-title function_ invoke__">socket_bind</span></span><span>(</span><span><span class="hljs-variable">$server</span></span><span>, </span><span><span class="hljs-string">'127.0.0.1'</span></span><span>, </span><span><span class="hljs-number">8888</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">socket_listen</span></span><span>(</span><span><span class="hljs-variable">$server</span></span><span>);
</span><span><span class="hljs-comment">// Définir le non-bloque</span></span><span>
</span><span><span class="hljs-title function_ invoke__">socket_set_nonblock</span></span><span>(</span><span><span class="hljs-variable">$server</span></span><span>);
</span><span><span class="hljs-variable">$clients</span></span><span> = [</span><span><span class="hljs-variable">$server</span></span><span>];
</span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-literal">true</span></span><span>) {
</span><span><span class="hljs-variable">$readSockets</span></span><span> = </span><span><span class="hljs-variable">$clients</span></span><span>;
</span><span><span class="hljs-variable">$writeSockets</span></span><span> = </span><span><span class="hljs-literal">null</span></span><span>;
</span><span><span class="hljs-variable">$exceptSockets</span></span><span> = </span><span><span class="hljs-literal">null</span></span><span>;
</span><span><span class="hljs-comment">// Lesquels sont vérifiés socket Lisible(Pas de blocage,1 Deuxième délai)</span></span><span>
</span><span><span class="hljs-variable">$numChangedSockets</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_select</span></span><span>(</span><span><span class="hljs-variable">$readSockets</span></span><span>, </span><span><span class="hljs-variable">$writeSockets</span></span><span>, </span><span><span class="hljs-variable">$exceptSockets</span></span><span>, </span><span><span class="hljs-number">1</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$numChangedSockets</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">"socket_select échouer:"</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>()) . PHP_EOL;
</span><span><span class="hljs-keyword">break</span></span><span>;
}
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$readSockets</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$sock</span></span><span>) {
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$sock</span></span><span> === </span><span><span class="hljs-variable">$server</span></span><span>) {
</span><span><span class="hljs-comment">// Il y a une nouvelle connexion</span></span><span>
</span><span><span class="hljs-variable">$newClient</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_accept</span></span><span>(</span><span><span class="hljs-variable">$server</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">socket_set_nonblock</span></span><span>(</span><span><span class="hljs-variable">$newClient</span></span><span>);
</span><span><span class="hljs-variable">$clients</span></span><span>[] = </span><span><span class="hljs-variable">$newClient</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Le nouveau client est connecté。"</span></span><span> . PHP_EOL;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-comment">// Un client envoie des données</span></span><span>
</span><span><span class="hljs-variable">$data</span></span><span> = @</span><span><span class="hljs-title function_ invoke__">socket_read</span></span><span>(</span><span><span class="hljs-variable">$sock</span></span><span>, </span><span><span class="hljs-number">1024</span></span><span>, PHP_NORMAL_READ);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$data</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span> || </span><span><span class="hljs-variable">$data</span></span><span> === </span><span><span class="hljs-string">""</span></span><span>) {
</span><span><span class="hljs-comment">// Déconnexion du client</span></span><span>
</span><span><span class="hljs-variable">$index</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_search</span></span><span>(</span><span><span class="hljs-variable">$sock</span></span><span>, </span><span><span class="hljs-variable">$clients</span></span><span>);
</span><span><span class="hljs-keyword">unset</span></span><span>(</span><span><span class="hljs-variable">$clients</span></span><span>[</span><span><span class="hljs-variable">$index</span></span><span>]);
</span><span><span class="hljs-title function_ invoke__">socket_close</span></span><span>(</span><span><span class="hljs-variable">$sock</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Déconnexion du client。"</span></span><span> . PHP_EOL;
} </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">"Données reçues:"</span></span><span> . </span><span><span class="hljs-title function_ invoke__">trim</span></span><span>(</span><span><span class="hljs-variable">$data</span></span><span>) . PHP_EOL;
}
}
}
}
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>Socket non bloquant : Pour éviter de bloquer le processus principal, toutes les prises doivent être réglées en mode non bloquant.
Demande de connexion de vérification du socket principal : lorsque Socket_Select détecte que le socket principal est lisible, il indique qu'il existe une nouvelle demande de connexion client.
Données de vérification du socket client : Lorsqu'un socket client est lisible, cela signifie que le client a envoyé les données.
Remarque : Si la lecture échoue ou si une chaîne vide est renvoyée, le client doit être considéré comme étant déconnecté.
Socket_Select () est un outil clé pour gérer les communications de socket simultanées. Par rapport au fait que chaque connexion a un thread ou un processus, le modèle sélectionné peut gérer un grand nombre de connexions plus légères et contrôlables. Compétent en informatique, votre application réseau PHP est plus stable et plus efficace.
J'espère que cet article peut vous aider à comprendre les scénarios et les pratiques d'utilisation de Socket_Select et peut vraiment jouer un rôle dans votre projet.
<span></span>