Ist ReactPHP wirklich asynchron?

Lesezeit: 3 Minuten

Benutzer-Avatar
Divi

Ich habe einige Tests mit ReactPHP durchgeführt, weil es ziemlich großartig aussieht. Ich habe es mit folgendem getestet reagieren/Buchse Code für einen einfachen Socket-Server.

$loop = React\EventLoop\Factory::create();

$socket = new React\Socket\Server($loop);
$socket->on('connection', function ($conn) {
    echo 'New client !';

    $conn->on('data', function ($data) use ($conn) {
        $conn->write("Wow, some data, such cool\n");
        $conn->close();
    });
});
$socket->listen(1337);

$loop->run();

Bis zu diesem Punkt gibt es kein Problem. Der Server zeigt New client ! wenn ein Client verbunden ist und der Client die Antwort erhält.

Aber ich habe einen neuen Test gemacht, mit mehr Verarbeitung auf dem data Veranstaltung. Um meine Worte zu veranschaulichen, füge ich ein hinzu for Schleife, die einige Millisekunden dauern wird:

$conn->on('data', function ($data) use ($conn) {
    $conn->write("Wow, some data, such cool\n");

    for ($i=0; $i<10000000; $i++); // here

    $conn->close();
});

In diesem Fall wird bei 10 Clients der Client den Text anzeigen Wow, some data, such cool nach allen kunden verarbeitung (also ~2 Sekunden)aber der Server wird angezeigt New client ! ohne zu warten.

Also hier mein Unverständnis, ReactPHP ist ein asynchrones I/O, aber PHP ist es eingängigund wenn zwischen Eingabe und Ausgabe viel Verarbeitung stattfindet, werden alle Clients blockiert.

  • stackoverflow.com/a/15501449/1073758

    – Mondwelle99

    19. März 2014 um 10:02 Uhr

  • Ich frage nicht, ob PHP Multithreading kann, ich verwende github.com/krakjoe/pthreads in einem anderen Projekt, aber kurz gesagt, wenn ich die Grenze dieser Bibliothek erreicht habe.

    – Divi

    19. März 2014 um 10:12 Uhr

  • Die Bibliothek ist im Grunde ein Wrapper stream_socket_server soweit ich das beurteilen kann. Die Frage ist ob stream_socket_server ist asynchron. Angesichts der grundlegenden Architektur von PHP würde mich das überraschen, aber ich kenne die definitive Antwort nicht.

    – verzeihen

    19. März 2014 um 10:28 Uhr

  • Sie können den nicht blockierenden Socket-Server mit einstellen stream_set_blocking(stream, wahr oder falsch)

    – Divi

    19. März 2014 um 10:36 Uhr

  • Sicher, aber: „Dies betrifft Aufrufe wie fgets() und fread(), die aus dem Stream lesen. Im nicht blockierenden Modus kehrt ein fgets()-Aufruf immer sofort zurück, während er im blockierenden Modus darauf wartet, dass Daten im Stream verfügbar werden.“ – Dies sagt nichts über asynchrone Behandlung aus …

    – verzeihen

    19. März 2014 um 10:44 Uhr

Benutzer-Avatar
jillro

ReactPHP ist ein asynchrones I/O, aber PHP ist Single-Threaded, und wenn zwischen Ein- und Ausgabe viel Verarbeitung stattfindet, blockiert das alle Clients.

Ja.

ReactPHP ist sehr stark von node.js inspiriert, das dem gleichen Prinzip folgt. Das Ziel solcher ereignisbasierter Muster besteht nicht darin, die CPUs Ihres Servers 16 auszunutzen, sondern Ihren Prozessor vollständig auszunutzen, indem die HTTP-Anforderung B verarbeitet wird, während Ihr Controller für die Anforderung A, die eine Anforderung an die Datenbank gestellt hat, angehalten wird, bis die Datenbankanforderung erfolgreich ist ‘ Veranstaltung aufgerufen wird.

Ihr Test geht genau gegen die Annahme von node.js und ReactPHP vor: „Berechnung ist schnell, E/A sind langsam“, wenn wir also Berechnungen während der E/A durchführen (und nicht zwischen den E/A), dann wird die CPU-Zeit dies tun immer in größerer Menge als benötigt verfügbar sein.

Wenn Sie mit node.js oder ReactPHP die 16-CPU Ihres Servers verwenden möchten, starten Sie einfach 16-Server-Prozesse auf 16-Port und stellen einen Load Balancer wie nginx davor.

Denken Sie jedoch daran, dass ReactPHP noch experimentell und nicht produktionsreif ist.

  • Was ist mit Kraken oder Swoole? Sind die auch experimentell? Und wie unterscheiden sie sich von amphp?

    – Gregory Magarshak

    9. Mai 2017 um 4:11 Uhr

  • Sie sollten sich dieses Video ansehen und selbst entscheiden. v=fQxxm4vD8Ok

    – Roboter70

    15. September 2019 um 16:21 Uhr


1227970cookie-checkIst ReactPHP wirklich asynchron?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy