In PHP ist die Kontrolle über Blockier- und Nicht-Blocking-Modi bei der Behandlung von Netzwerkkommunikation sehr wichtig. SOCKKET_SET_BLOCK UND STROM_SET_BLOCKING sind zwei häufig verwendete Funktionen. Beide werden verwendet, um das Blockierverhalten von Steckdosen oder Streams festzulegen, aber es gibt einige Unterschiede in den anwendbaren Objekten und Verwendungen. In diesem Artikel werden die Unterschiede zwischen diesen beiden Funktionen und ihren Nutzungsmethoden im Detail einführen.
Blockierungsmodus : Funktionsaufrufe warten, bis der Vorgang abgeschlossen ist, z. B. das Lesen von Daten, bis Daten lesbar sind, Daten schreiben, bis die Übertragung abgeschlossen ist. Das Programm wird in dieser Zeit innehalten und warten.
Nicht-Blocking-Modus : Der Funktionsaufruf wartet nicht, bis die Operation abgeschlossen ist. Wenn der Betrieb nicht sofort abgeschlossen werden kann, wird sofort zurückgegeben und das Programm weiterhin andere Aufgaben ausführen.
Anwendbar für: Socket -Ressourcen in der PHP -Socket -Erweiterung (erstellt durch Funktionen wie Socket_Create () )
Funktion: Stellen Sie den Socket auf den Blockierungsmodus ein.
Funktionsprototyp:
bool socket_set_block(resource $socket)
Rückgabewert: Return true für den Erfolg, Rückgabe falsch für das Scheitern
Geeignet für: Stream-basierte Ressourcen , wie die von fopen () , stream_socket_client () zurückgegebene Ressource oder die von Socket_Create () konvertierte Stream-Ressource über Socket_import_Stream () .
Funktion: Stellen Sie den Blockierungsmodus des Flusses ein.
Funktionsprototyp:
bool stream_set_blocking(resource $stream, int $mode)
Parameter:
$ Stream : Streaming -Ressourcen
$ modus : 1 bedeutet blockieren, 0 bedeutet nicht blockierend
Rückgabewert: Return true für den Erfolg, Rückgabe falsch für das Scheitern
Merkmal | SOCKKET_SET_BLOCK | Stream_set_Blocking |
---|---|---|
Anwendbare Ressourcen | Sockelressourcen in Sockelverlängerungen | PHP -Streaming -Ressourcen (Dateiströme, Netzwerkströme usw.) |
Blockierungsmoduseinstellungsmethode | Rufen Sie direkt ohne zusätzliche Parameter auf | Geben Sie den Blockierungsmodus mit dem zweiten Parameter (0 oder 1) an |
Nutzungsflexibilität | Nur Blockierung kann eingestellt werden, socket_set_nonblock () ist für nicht blockierende | Blockierung oder Nichtblockierung kann eingestellt werden |
Anwendbare Szenarien | Low-Level-Sockelprogrammierung | Hochrangige Netzwerkflussprogrammierung |
<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
die("socket_create failed: " . socket_strerror(socket_last_error()));
}
socket_set_block($socket); // Einstellen auf den Blockierungsmodus
// Stellen Sie eine Verbindung zum Server her
socket_connect($socket, "gitbox.net", 80);
// Senden Sie eine Anfrage
$request = "GET / HTTP/1.1\r\nHost: gitbox.net\r\nConnection: Close\r\n\r\n";
socket_write($socket, $request, strlen($request));
// Lesen Sie die Antwort
$response = '';
while ($out = socket_read($socket, 2048)) {
$response .= $out;
}
echo $response;
socket_close($socket);
?>
<?php
$stream = stream_socket_client("tcp://gitbox.net:80", $errno, $errstr, 30);
if (!$stream) {
die("Connection failed: $errstr ($errno)");
}
// Einstellen auf den Blockierungsmodus
stream_set_blocking($stream, 1);
// Senden Sie eine Anfrage
fwrite($stream, "GET / HTTP/1.1\r\nHost: gitbox.net\r\nConnection: Close\r\n\r\n");
// Lesen Sie die Antwort
$response = '';
while (!feof($stream)) {
$response .= fread($stream, 2048);
}
echo $response;
fclose($stream);
?>
Socket_Set_Block wird speziell für Socket -Ressourcen in der Socket -Erweiterung von PHP verwendet und setzt den Socket direkt auf einen Blockierstatus.
Stream_set_Blocking eignet sich für eine breitere Reihe von Stream-Ressourcen und bietet flexibles Wechsel zwischen Blockier- und Nicht-Blocking-Modi.
Welche Funktion zu wählen ist, hängt hauptsächlich von der Art der Ressource ab, die Sie verwenden: Wenn Sie Socket -Erweiterung verwenden, um Sockets zu verwalten, verwenden Sie Socket_Set_Block . Wenn Sie Stream -Ressourcen (z. B. Stream_Socket_Client ) verwenden, verwenden Sie Stream_Set_Blocking .
Wenn Sie diese beiden Funktionen und deren Unterschiede verstehen, können Sie das Lesen und Schreiben von Verhaltensweisen in der PHP -Netzwerkprogrammierung besser kontrollieren und die Programmleistung und -reaktion optimieren.