<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// Le contenu suivant n'a rien à voir avec le texte principal de l'article</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Voici un exemple PHP Code,Utilisé pour afficher les préfaces qui ne sont pas liées à l'article。\n"</span></span><span>;
-------------------------------------------------------------------------------
<span class="hljs-comment">/**
* Comment passer stream_set_blocking contrôle PHP Comportement de lecture des prises,Améliorer les performances des applications réseau?
*
* exister PHP Dans la programmation réseau,Prises(socket)Le comportement de lecture a un impact direct sur les performances de l'application。Par défaut,
* PHP 的Prises操作是阻塞式的,C'est-à-dire lorsque vous appelez la fonction de lecture(comme fread ou stream_get_contents)heure,
* comme果没有数据到达,Le programme attendra,Jusqu'à ce que les données soient disponibles。这种行为exister高并发ou长连接场景下容易导致性能瓶颈。
*
* Pour résoudre ce problème,PHP Fourni stream_set_blocking fonction,可以灵活地contrôlePrises的Mode de blocage。
*
* un、stream_set_blocking Utilisation de base
*
* fonction原型:
* bool stream_set_blocking ( resource $stream , int $mode )
*
* Description du paramètre:
* - $stream: Prisesressource(stream ressource)。
* - $mode: Mode de blocage,1 Indique le blocage(blocking),0 Indique non bloquant(non-blocking)。
*
* Exemple:
*/</span>
</span><span><span class="hljs-variable">$socket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_socket_client</span></span><span>(</span><span><span class="hljs-string">"tcp://127.0.0.1:8080"</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">$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">$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">// 设置非Mode de blocage</span></span><span>
</span><span><span class="hljs-title function_ invoke__">stream_set_blocking</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>);
</span><span><span class="hljs-comment">// Essayez de lire les données</span></span><span>
</span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fread</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-number">8192</span></span><span>);
</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-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Il n'y a actuellement pas de données lisibles,Le programme continue d'exécuter。\n"</span></span><span>;
} </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">"Lire les données: <span class="hljs-subst">$data</span></span></span><span>\n";
}
}
-------------------------------------------------------------------------------
<span class="hljs-comment">/**
* deux、Mode de blocage与非Mode de blocage的差异
*
* 1. Mode de blocage(blocking)
* - fread ou fgets Attendra que les données arrivent avant de revenir。
* - Convient pour le fil unique、Scénarios de faible concurrence。
* - Simple,但可能导致长heure间等待阻塞整个脚本。
*
* 2. 非Mode de blocage(non-blocking)
* - fread 等fonction立即返回,若无数据则返回空ou false。
* - Adapté au traitement asynchrone、Scénarios de concurrence élevés。
* - Peut être combiné stream_select 监控多个Prises的可读状态,Cela améliore les performances des applications réseau。
*
* trois、Combiné stream_select Améliorer les performances
*
* stream_select Il peut surveiller si plusieurs flux sont lisibles、可写ou发生异常:
*
* Exemple:
*/</span>
</span><span><span class="hljs-variable">$read</span></span><span> = [</span><span><span class="hljs-variable">$socket</span></span><span>];
</span><span><span class="hljs-variable">$write</span></span><span> = </span><span><span class="hljs-literal">null</span></span><span>;
</span><span><span class="hljs-variable">$except</span></span><span> = </span><span><span class="hljs-literal">null</span></span><span>;
</span><span><span class="hljs-variable">$timeout</span></span><span> = </span><span><span class="hljs-number">2</span></span><span>; </span><span><span class="hljs-comment">// 超heureheure间 2 Deuxième</span></span><span>
</span><span><span class="hljs-variable">$num_changed_streams</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_select</span></span><span>(</span><span><span class="hljs-variable">$read</span></span><span>, </span><span><span class="hljs-variable">$write</span></span><span>, </span><span><span class="hljs-variable">$except</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">$num_changed_streams</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">"监控Prises出错\n"</span></span><span>;
} </span><span><span class="hljs-keyword">elseif</span></span><span> (</span><span><span class="hljs-variable">$num_changed_streams</span></span><span> === </span><span><span class="hljs-number">0</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"超heure,Aucune donnée lisible encore\n"</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$read</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$r</span></span><span>) {
</span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fread</span></span><span>(</span><span><span class="hljs-variable">$r</span></span><span>, </span><span><span class="hljs-number">8192</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Données reçues: <span class="hljs-subst">$data</span></span></span><span>\n";
}
}
-------------------------------------------------------------------------------
<span class="hljs-comment">/**
* Quatre、Suggestions d'optimisation des performances dans des applications pratiques
*
* 1. exister高并发网络应用中,尽量utiliser非Mode de blocage读取Prises,Évitez de bloquer l'ensemble du processus par une seule connexion lente。
* 2. utiliser stream_select ou类似事件循环机制(comme ReactPHP)来轮询多个Prises。
* 3. Pour de longues connexions,合理设置读取超heureheure间,Évitez le blocage infini。
* 4. 避免existerMode de blocage下处理大量数据,必要heure可分块读取ouutiliser缓冲。
*
* 通过合理utiliser stream_set_blocking et mécanisme de boucle d'événement,Peut améliorer considérablement PHP Vitesse de réponse et débit des applications réseau。
*/</span>
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>