Rendimiento con el uso de WebSocket en PHP
El uso de WebSocket y el consumo de eventos en tiempo real es parte esencial de entornos IIoT. Pero ojo, cuidado con el rendimiento.
Pablo

Pablo

Software Engineer

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

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%

Dónde Estamos

Espacio RES

Avda. República Argentina 25 Planta 9, 41011 Sevilla

Cómo Contactar

Envíanos un Email

Conocenos más

Contacta con nosotros

Visita nuestra sección de contacto y pídenos lo que necesites

Share This