Ist ReactPHP wirklich asynchron?

Ich habe einige Tests mit ReactPHP durchgeführt, weil es ziemlich fantastisch aussieht. Ich habe es mit den folgenden getestetreagieren / steckdose 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 dahin gibt es kein Problem. Der Server zeigtNew client ! wenn ein Client verbunden ist und der Client die Antwort erhält.

Aber ich habe einen neuen Test gemacht, mit mehr Verarbeitung auf derdata Veranstaltung. Um meine Worte zu veranschaulichen, füge ich einfor Schleife, die einige Millisekunden dauert:

$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 zeigt der Client bei 10 Clients den Text anWow, some data, such cool nachdem alle Kunden verarbeitet haben(also ~ 2 Sekunden), aber der Server zeigtNew client ! ohne zu warten.

Mein Unverständnis ist, dass ReactPHP eine asynchrone E / A ist, PHP jedochSingle-ThreadedWenn zwischen Eingabe und Ausgabe viel Verarbeitung stattfindet, werden alle Clients blockiert.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage