Heim  >  Artikel  >  Backend-Entwicklung  >  Was sind die Implementierungsmethoden für nicht blockierendes IO in PHP7.0?

Was sind die Implementierungsmethoden für nicht blockierendes IO in PHP7.0?

王林
王林Original
2023-05-26 08:51:291245Durchsuche

PHP7.0 ist eine beliebte Programmiersprache, die häufig in der Webentwicklung und serverseitigen Entwicklung verwendet wird. Eines der wichtigen Updates ist die Einführung von nicht blockierendem I/O. Nicht blockierende E/A ist eine asynchrone Programmiertechnik, die mehrere E/A-Vorgänge gleichzeitig verarbeiten kann, ohne den aktuellen Thread zu blockieren. Diese Technik verbessert die Parallelitätsleistung und Reaktionsfähigkeit erheblich. In diesem Artikel wird die nicht blockierende I/O-Implementierung in PHP7.0 vorgestellt.

  1. Stream Select

Stream Select ist eine der einfachsten nicht blockierenden I/O-Implementierungen in PHP7.0. Diese Methode verwendet den Select-Systemaufruf, um zu prüfen, ob alle Dateistreams (Streams beziehen sich auf offene Dateihandles, Sockets usw.) über lesbare Daten verfügen, und wenn ja, lesen Sie die Daten. Dieser Prozess ist nicht blockierend und blockiert daher nicht den aktuellen Prozess.

Der Code für die Verwendung von Stream Select lautet wie folgt:

$read = array($fp);
$write = array();
$except = array();
if (false === ($num_changed_streams = stream_select($read, $write, $except, 0))) {
    die('Error Occured');
} elseif ($num_changed_streams > 0) {
    //有数据可读
    $data = fread($fp, $buffer_size);
} else {
    //无数据可读
}

Der obige Code verwendet zunächst die Funktion stream_select, um zu prüfen, ob lesbare Daten vorhanden sind, und liest, wenn ja, die Daten. Dieser Prüfprozess ist nicht blockierend und blockiert daher nicht den aktuellen Prozess.

  1. Event Loop

Event Loop ist eine weitere häufig verwendete nicht blockierende I/O-Implementierung in PHP7.0. Die Ereignisschleife implementiert nicht blockierende E/A-Vorgänge durch die Registrierung von Ereignisrückruffunktionen, die aufgerufen werden, wenn Ereignisse auftreten. In der Ereignisschleife verarbeitet die Anwendung E/A-Vorgänge, indem sie Ereignisse hinzufügt und die Ereignisschleife startet. In der Webentwicklung können Sie beispielsweise Event Loop verwenden, um HTTP-Anfragen zu verarbeiten.

Das Folgende ist ein Beispiel für die Verwendung von Event Loop zur Verarbeitung von HTTP-Anfragen:

$loop = ReactEventLoopFactory::create();
$client = new ReactHttpClientClient($loop);

$request = $client->request('GET', 'http://www.example.com/');
$request->on('response', function ($response) {
    $response->on('data', function ($chunk) {
        echo $chunk;
    });
});
$request->end();

$loop->run();

Im obigen Beispiel wird zuerst ein Event-Loop-Objekt $loop basierend auf ReactPHP erstellt, dann wird ein HTTP-Client $client erstellt und eine GET-Anfrage wird eingeleitet. Verwenden Sie in der Rückruffunktion der Anforderungsantwort Echo, um die empfangenen Daten auszugeben.

  1. Coroutine

Coroutine ist eine weitere nicht blockierende I/O-Implementierung, die in PHP7.0 eingeführt wurde. Coroutine nutzt die Eigenschaften von Coroutinen, um bei der Verarbeitung von E/A-Vorgängen die aktuelle Coroutine anzuhalten und andere Coroutinen auszuführen. Wenn der E/A-Vorgang abgeschlossen ist, kann die Coroutine ihre Ausführung fortsetzen und mit der Ausführung des folgenden Codes fortfahren. Dieser Vorgang ist nicht blockierend.

Das Folgende ist ein Beispiel für die Verwendung von Coroutine zur Verarbeitung von E/A-Vorgängen:

$server = new SwooleServer("127.0.0.1", 9501, SWOOLE_PROCESS, SWOOLE_SOCK_TCP);

$server->on('Receive', function ($serv, $fd, $from_id, $data) {
    $result = "";
    $fp = stream_socket_client("tcp://127.0.0.1:80", $errno, $errstr, 30);
    fwrite($fp, $data);
    while (!feof($fp)) {
        $result .= fgets($fp, 1024);
    }
    fclose($fp);
    swoole_coroutine::sleep(0.1);
    $serv->send($fd, $result);
});

$server->start();

Im obigen Code verwenden Sie zunächst die Swoole-Erweiterung, um ein TCP-Serverobjekt $server zu erstellen. Verwenden Sie in der Rückruffunktion, die Clientdaten empfängt, die Funktion stream_socket_client, um eine HTTP-Anfrage zu initiieren, und verwenden Sie eine While-Schleife, um die Antwortdaten zu lesen. Verwenden Sie beim Lesen von Daten swoole_coroutine::sleep(0.1), um die Ausführung der aktuellen Coroutine anzuhalten und auf die Ausführung anderer Coroutinen zu warten. Wenn die Antwortdaten erfolgreich gelesen wurden, werden die Daten an den Client zurückgesendet.

Fazit

PHP7.0 führt eine Vielzahl nicht blockierender E/A-Implementierungsmethoden ein, darunter Stream Select, Event Loop, Coroutine usw. Diese Technologien ermöglichen es PHP-Anwendungen, mehrere E/A-Vorgänge gleichzeitig abzuwickeln und so die Parallelitätsleistung und Reaktionsgeschwindigkeit zu verbessern. Viele PHP-Frameworks und -Bibliotheken wie ReactPHP und Swoole haben diese nicht blockierenden I/O-Technologien integriert, um Entwicklern beim Schreiben leistungsstarker Webanwendungen zu helfen.

Das obige ist der detaillierte Inhalt vonWas sind die Implementierungsmethoden für nicht blockierendes IO in PHP7.0?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn