<span><span><span class="hljs-meta"><?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">?></span></span><span>
</span></span>