Aktueller Standort: Startseite> Neueste Artikel> Wie steuern Sie das Leseverhalten von Sockets in PHP über Stream_Set_Blocking, um die Leistung der Netzwerkanwendungen zu verbessern?

Wie steuern Sie das Leseverhalten von Sockets in PHP über Stream_Set_Blocking, um die Leistung der Netzwerkanwendungen zu verbessern?

gitbox 2025-09-20
<span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-comment">// Der folgende Inhalt hat nichts mit dem Haupttext des Artikels zu tun</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Hier ist ein Beispiel PHP Code,Wird verwendet, um Präparate anzuzeigen, die nicht mit dem Artikel zusammenhängen。\n"</span></span><span>;

-------------------------------------------------------------------------------

<span class="hljs-comment">/**
 * Wie man passt stream_set_blocking Kontrolle PHP Leseverhalten von Steckdosen in,Verbesserung der Leistung der Netzwerkanwendung?
 *
 * existieren PHP In der Netzwerkprogrammierung,Steckdosen(socket)Das Leseverhalten wirkt sich direkt auf die Anwendungsleistung aus。Standardmäßig,
 * PHP 的Steckdosen操作是阻塞式的,Das heißt, beim Aufrufen der Lesefunktion(wie fread oder stream_get_contents)Stunde,
 * wie果没有数据到达,Das Programm wird warten,Bis die Daten verfügbar sind。这种行为existieren高并发oder长连接场景下容易导致性能瓶颈。
 *
 * Dieses Problem zu lösen,PHP Bereitgestellt stream_set_blocking Funktion,可以灵活地KontrolleSteckdosen的Blockierungsmodus。
 *
 * eins、stream_set_blocking Grundnutzung
 *
 * Funktion原型:
 * bool stream_set_blocking ( resource $stream , int $mode )
 *
 * Parameterbeschreibung:
 * - $stream: SteckdosenRessource(stream Ressource)。
 * - $mode: Blockierungsmodus,1 Zeigt Blockierung an(blocking),0 Zeigt nicht blockierende an(non-blocking)。
 *
 * Beispiel:
 */</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">"Verbindung ist fehlgeschlagen: <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">// 设置非Blockierungsmodus</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">// Versuchen Sie, Daten zu lesen</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">"Derzeit gibt es keine lesbaren Daten,Das Programm wird weiterhin ausgeführt。\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">"Daten lesen: <span class="hljs-subst">$data</span></span></span><span>\n";
    }
}
-------------------------------------------------------------------------------

<span class="hljs-comment">/**
 * zwei、Blockierungsmodus与非Blockierungsmodus的差异
 *
 * 1. Blockierungsmodus(blocking)
 *    - fread oder fgets Warten Sie, bis die Daten vor der Rückkehr eintreffen。
 *    - Geeignet für einzelne Faden、Niedrige Parallelitätsszenarien。
 *    - Einfach,但可能导致长Stunde间等待阻塞整个脚本。
 *
 * 2. 非Blockierungsmodus(non-blocking)
 *    - fread 等Funktion立即返回,若无数据则返回空oder false。
 *    - Geeignet für die asynchrone Verarbeitung、Hohe Parallelitätsszenarien。
 *    - Kann kombiniert werden stream_select 监控多个Steckdosen的可读状态,Dies verbessert die Leistung der Netzwerkanwendungen。
 *
 * drei、Kombiniert stream_select Leistung verbessern
 *
 * stream_select Es kann überwachen, ob mehrere Streams lesbar sind、可写oder发生异常:
 *
 * Beispiel:
 */</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">// 超StundeStunde间 2 Zweite</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">"监控Steckdosen出错\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">"超Stunde,Noch keine lesbaren Daten\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">"Daten erhalten: <span class="hljs-subst">$data</span></span></span><span>\n";
    }
}
-------------------------------------------------------------------------------

<span class="hljs-comment">/**
 * Vier、Vorschläge zur Leistungsoptimierung in praktischen Anwendungen
 *
 * 1. existieren高并发网络应用中,尽量verwenden非Blockierungsmodus读取Steckdosen,Vermeiden Sie es, den gesamten Vorgang durch eine einzige langsame Verbindung zu blockieren。
 * 2. verwenden stream_select oder类似事件循环机制(wie ReactPHP)来轮询多个Steckdosen。
 * 3. Für lange Verbindungen,合理设置读取超StundeStunde间,Vermeiden Sie unendliche Blockade。
 * 4. 避免existierenBlockierungsmodus下处理大量数据,必要Stunde可分块读取oderverwenden缓冲。
 *
 * 通过合理verwenden stream_set_blocking und Ereignisschleifungsmechanismus,Kann sich erheblich verbessern PHP Reaktionsgeschwindigkeit und Durchsatz von Netzwerkanwendungen。
 */</span>
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>