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.