Compartir datos entre procesos

Por medio de esta clase podemos usar la memoria compartida como si fuera un array normal. Cada vez que se trata de leer y escribir en el array se estará accediendo a la memoria compartida para almacenar de manera persistente la información y poder compartir entre procesos los datos.

Esta clase toma en cuenta la concurrencia por lo que hace uso de semáforos antes de leer y escribir los datos en memoria.

Se ha implementado como un singleton para evitar fragmentación de la memoria compartida al obligar a usar un solo bloque el cual deberá ser de tamaño suficiente para almacenar toda la información requerida durante el tiempo de vida del script y su tamaño deberá ser especificado antes de llamar al método attach.

Es importante tener en cuenta que para trabajar con memoria compartida se usan IDs numéricos. Se ha hecho un método para tratar de convertir valores no numéricos en numéricos. En caso de existir colisiones se debe extender la clase y modificar el método _transformKey para que las claves siempre sean únicas o evitar el uso de claves no numéricas.

Ejemplos de uso

Proceso principal

El proceso principal sería el que escribe los datos para que el secundario los lea. Debería escribirlos de la siguiente manera:

  1. $shm = jf\system\SharedMemory::getInstance();
  2. $shm->memsize = 200000;
  3. $shm->setKey(1234);
  4. $shm->attach();
  5. $shm['finished'] = 0;
  6. // Código
  7. $shm['finished'] = 1;

Proceso secundario

El proceso secundario leería los datos escritos por el principal de la siguiente manera:

  1. $shm = jf\system\SharedMemory::getInstance();
  2. $shm->setKey(1234);
  3. $shm->attach();
  4. if ($shm['finished'])
  5. {
  6.     // Código
  7. }