Die Hauptfunktion der Funktion Socket_Set_Block besteht darin, einen Socket auf den Blockierungsmodus einzustellen. Blockierungsmodus bedeutet, dass das Programm, wenn Sie Operationen wie Socket_read oder Socket_Write ausführen, das Programm pausieren, bis die Daten verfügbar sind oder der Betrieb abgeschlossen ist.
<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, "gitbox.net", 80);
socket_set_block($socket);
socket_write($socket, "GET / HTTP/1.1\r\nHost: gitbox.net\r\nConnection: Close\r\n\r\n");
$response = '';
while ($out = socket_read($socket, 2048)) {
$response .= $out;
}
socket_close($socket);
echo $response;
?>
Im obigen Code stellt Socket_Set_Block sicher, dass Socket_read auf die Ankunft der Daten wartet und nicht sofort zurückgibt.
Vorteile des Blockierungsmodus <br> Wenn das Programm Anrufe blockiert, wird die CPU an das Betriebssystem freigegeben, um andere Aufgaben auszuführen. Mit anderen Worten, die CPU ist nicht damit beschäftigt, den Socket -Zustand zu befragen, sondern schläft und wartet darauf, dass das Betriebssystem die verfügbaren Daten benachrichtigt. Dies macht die Nutzung der CPU niedrig und die Ressourcen werden vernünftigerweise genutzt.
Nachteile des Blockierungsmodus <br> Blockieren bedeutet, dass das Programm an einem bestimmten Rufpunkt anhält. Wenn das Netzwerk- oder Peer -Antwort langsam ist, wird das Programm auch "festgefahren" und kann andere Aufgaben nicht erledigen. In hohen Parallelitätsszenarien kann die Verwendung mehrerer Steckdosen im Blockierungsmodus eine langsame Anwendungsreaktion verursachen.
Obwohl der Blockierungsmodus natürlich dazu beiträgt, die CPU -Nutzung zu reduzieren, kann dies auch auf das Problem der ungewöhnlich hohen CPU -Verwendung in praktischen Anwendungen stoßen. Häufige Gründe sind:
Häufige nicht blockierende Umfragen (beschäftigt wartet)
Wenn Entwickler den nicht blockierenden Modus verwenden oder die Wahllogik für sich selbst implementieren, wird das Programm weiterhin die Lesefunktion aufrufen, wodurch die CPU beschäftigt ist.
Falsches Blockier-/Nicht-Blocking-Modus-Switching <br> Wenn die Schaltzuwechsel des Sockelzustands häufig und nicht ordnungsgemäß gesteuert ist, kann dies zu Ineffizienz bei Systemaufrufen führen und die CPU -Last erhöhen.
Fehlende ereignisgesteuerte oder asynchrone Mechanismus <br> Nur die Blockierung wird verwendet, um eine große Anzahl von Steckdosen zu verarbeiten, wodurch das Programm nicht mehrere Verbindungen parallel verarbeitet.
Socket_Select kann mehrere Socket -Zustände anhören und arbeiten, wenn ein oder mehrere Sockets lesbar und schriftlich sind, um Geschäftigkeit zu vermeiden.
<?php
$read = [$socket];
$write = $except = null;
if (socket_select($read, $write, $except, 5) > 0) {
foreach ($read as $readableSocket) {
$data = socket_read($readableSocket, 2048);
// Verarbeitungsdaten
}
}
?>
Auf diese Weise wird das Programm nur dann geweckt, wenn der Socket Daten hat, was die CPU -Müßiggang verringert.
Im Blockierungsmodus kann die Zeitüberschreitung über socket_set_option eingestellt werden, um eine langfristige Blockierung zu verhindern:
<?php
socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, ["sec"=>3, "usec"=>0]);
socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, ["sec"=>3, "usec"=>0]);
?>
Durch ordnungsgemäßes Einstellen der Puffergröße kann auch die Anzahl der Systemaufrufe und die Kontextschaltung reduziert werden.
Bei hohen gleichzeitigen Anwendungen können mehrere Prozesse oder mehrere Fäden verwendet werden, um die durch Blockierung verursachten Engpässe zu teilen, um zu vermeiden, dass eine Einzelprozess-Blockierung die Gesamtleistung beeinflusst.
PHP verfügt über asynchrone Erweiterungen wie Smoke und ReactPHP , die nicht blockierende und ereignisgesteuerte Modelle unterstützen, wodurch die Nutzung der Ressourcen erheblich verbessert und die CPU-Verwendung reduziert wird.
Socket_Set_Block blockiert Socket -Operationen, reduziert die CPU -Müßiggang und verbessert die Effizienz einzelner Verbindungen.
Der Blockierungsmodus kann eine langsame Anwendungsreaktion in hohen Parallelitätsszenarien verursachen.
Die Kombination von Multiplexing -Technologien wie Socket_Select und einigermaßen Einstellung von Zeitüberschreitungsparametern kann die CPU -Verwendung erheblich verringern.
Die Verwendung eines asynchronen oder mehrprozessigen Modells ist ein effektives Mittel zur Verbesserung der Leistung und Ressourcenauslastung.
Das Verständnis des Prinzips der Auswirkungen von Socket_Set_Block auf die CPU und die Kombination angemessener Optimierung kann PHP -Netzwerkanwendungen effizienter und stabiler machen.