tutorial socket servidor react examples con php sockets asynchronous reactphp

servidor - socket php ratchet



¿Es ReactPHP realmente asíncrono? (1)

ReactPHP es una E / S asíncrona, pero PHP tiene un solo subproceso, y si hay mucho procesamiento entre la entrada y la salida, eso bloqueará a todos los clientes.

Sí.

ReactPHP está muy inspirado en node.js, que sigue el mismo principio. El objetivo de dichos patrones basados ​​en eventos no es explotar las 16 CPU de su servidor, sino explotar completamente su procesador procesando la solicitud HTTP B mientras su controlador para la solicitud A, que ha solicitado a la base de datos, se pausa hasta que la base de datos solicite el éxito. ''evento se llama.

Su prueba va exactamente en contra de la suposición hecha por node.js y ReactPHP: "el cálculo es rápido, las E / S son lentas", por lo que si hacemos cálculos durante E / S (y no entre E / S), entonces el tiempo de CPU siempre estará disponible en mayor cantidad de la necesaria.

Con node.js o ReactPHP si desea utilizar su CPU de servidor 16, solo debe iniciar el proceso de 16 servidores en el puerto 16 y colocar un equilibrador de carga como nginx delante de ellos.

Pero tenga en cuenta que ReactPHP aún es experimental y no está listo para la producción.

He estado haciendo algunas pruebas en ReactPHP porque se ve bastante impresionante. Lo probé con el siguiente código de react/socket , para un servidor de socket simple.

$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();

Hasta este punto no hay problema. El servidor muestra ¡ New client ! cuando un cliente está conectado y el cliente recibe la respuesta.

Pero hice una nueva prueba, con más procesamiento en el evento de data . Para ilustrar mis palabras, agregaré un bucle for que tardará unos milisegundos en completarse:

$conn->on(''data'', function ($data) use ($conn) { $conn->write("Wow, some data, such cool/n"); for ($i=0; $i<10000000; $i++); // here $conn->close(); });

En este caso, con 10 clientes, el cliente mostrará el texto Wow, some data, such cool después de que todos los clientes procesen (por Wow, some data, such cool ~ 2 segundos) , pero el servidor mostrará ¡ New client ! Sin esperar.

Así que aquí mi falta de comprensión, ReactPHP es una E / S asíncrona, pero PHP tiene un solo subproceso , y si hay mucho procesamiento entre la entrada y la salida, eso bloqueará a todos los clientes.