Seleccionar página
Pablo

Pablo

Software Engineer

Aventurero, viajero, fotográfo, quesero, jamonero y cervecero. AKA el MacGyver del software

PHP | WebSocket

Por necesidades del desarrollo tuvimos que integrar un cliente WebSocket (WS) para recibir eventos de Deepstream (https://deepstreamhub.com/open-source/) en nuestra plataforma Polaris Industry.

La mayoría de estos clientes hacían uso de un bucle simple de “escucha” que nos llevó al mayor de todos los males, el problema de rendimiento. Teníamos un componente capaz de leer mensajes por WebSocket pero que devoraba toda la CPU disponible.

Necesitábamos reducir este bloqueo de nuestro componente y que se ejecutase en segundo plano sin bloquear al proceso principal y liberar el uso de recursos del sistema.

Nos encontramos con EventLoop de ReactPHP (https://github.com/reactphp/event-loop), que nos permite la creación de librerías asíncronas interoperables.


// [1] Instanciamos el bucle
$loop = React\EventLoop\Factory::create();

// [2] Añadimos el tiempo de on-off que hay entre cada ejecución del bucle y usamos un componente de React para la lectura de un fichero
$loop->addPeriodicTimer(1, function () {
   echo "Tick\n";
});

$stream = new React\Stream\ReadableResourceStream(
  fopen('file.txt', 'r'),
  $loop
);

// [3] Iniciamos el bucle
$loop->run();

Esta es la base del cliente de WebSocket que estamos usando en nuestra aplicación (https://github.com/6phere/php-websocket/), nos ha permitido reducir significativamente tanto el uso de CPU, como de memoria RAM.

  • CPU ANTES DE LA OPTIMIZACIÓN 104.63% 104.63%
  • CPU DESPUÉS DE LA OPTIMIZACIÓN 2.95% 2.95%
  • RAM ANTES DE LA OPTIMIZACIÓN 16.04% 16.04%
  • RAM DESPUÉS DE LA OPTIMIZACIÓN 9.65% 9.65%
Share This