Position actuelle: Accueil> Derniers articles> Comment contrôler le comportement de lecture des sockets dans PHP via Stream_Set_Blocking pour améliorer les performances de l'application réseau?

Comment contrôler le comportement de lecture des sockets dans PHP via Stream_Set_Blocking pour améliorer les performances de l'application réseau?

gitbox 2025-09-20
<span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-comment">// Le contenu suivant n&#39;a rien à voir avec le texte principal de l&#39;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&#39;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&#39;application。Par défaut,
 * PHP 的Prises操作是阻塞式的,C&#39;est-à-dire lorsque vous appelez la fonction de lecture(comme fread ou stream_get_contents)heure,
 * comme果没有数据到达,Le programme attendra,Jusqu&#39;à 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&#39;y a actuellement pas de données lisibles,Le programme continue d&#39;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&#39;optimisation des performances dans des applications pratiques
 *
 * 1. exister高并发网络应用中,尽量utiliser非Mode de blocage读取Prises,Évitez de bloquer l&#39;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&#39;é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">?&gt;</span></span><span>
</span></span>