Trabajar con memoria compartida entre procesos php

    Para los que no deseen emplear fifos para la comunicación entre procesos php, la otra solución es compartir un segmento de memoria. Esta tarea se puede realizar con los comandos shmop.

Estas funciones no precisan la instalación de extensiones especificas pero si la compilación de tu php con el parámetro –enable-shmop

Esta opción nos permite tener disponibles los siguientes comandos

– shmop_close — Cierra un segmento de memoria compartida
-shmop_delete — Borra un segmento de memoria compartida
– shmop_open — Crea o abre un segmento de memoria compartida
– shmop_read — Lee un segmento de memoria compartida
– shmop_size — Obtiene el tamaño de un segmento de memoria compartida
– shmop_write — Escribe datos en un segmento de memoria compartida

Se emplean de manera analoga a como lo hariamos con un fichero o con un socket

Primero abrimos el segmento compartido con chmop_open, luego leemos o escribimos (las dos opciones son posibles a diferencia de los fifos en GNU/Linux donde o abrimos el fifo para lectura o para escritura) con shmop_read o shmop_write. Y finalmente cerramos el segmento de memoria compartido con chmop_close.

Este seria un ejemplo sencillo

<?php

//0xff3 – identificador segmento, se debe utilizar en todos los segmentos a compartir
// «c» – Opciones: c para crear, a para acceder, w acceder lectura/escritura y n crear nuevo segmento
// 0644 – Permisos GNU/Linux
// 100 – Tamaño en bytes
if(!$sh = shmop_open(0xff3, «c», 0644, 100))
{
die(‘Error creando segmento de memoria compartido’);
}

// El 0 es el offset sobre el segmento de memoria, para leer desde el principio 0
shmop_write($sh, «mi segmento de memoria compartida»,0);

$my_string = shmop_read($sh, 0, strlen(«mi segmento de memoria compartida»));

echo $my_string;
shmop_close($sh);

?>

FIFOs en linux

¿Que es un FIFO?

FIFO significa Fist In First Out (primero en entrar, primero en salir) y es utilizado en estruturas de datos para implementar colas. Su comportamiento como se ve es análogo al de una cola donde la primera persona en llegar es la primera en ser atendida.

En GNU/Linux podemos crear objetos tipo fifo en nuestro sistema de archivos. Para ello tenemos el comando mkfifo. Para crear un fichero tipo fifo, también llamado tuberia (pipe) debemos ejecutar:

$ mkfifo nombre_fifo

Para introducir datos en el puedes emplear el operador >

Por ejemplo

$ echo Hola > nombre_fifo

y para extraer datos de el basta por ejemplo ejecutar

$ cat nombre_fifo

Prueba a crear una fifo y desde dos terminales distintas ejecuta los dos comandos anteriores. Verás que cualquiera de ello espera a que el otro escriba o lea los datos que necesita. No importa el orden en el que los ejecutes.

Si ejecutas:

$ ls -l nombre_fifo

Verás que la primera letra que sale, la que corresponde al tipo de fichero es una p de pipe.

A diferencia de las tuberias en linea (|) que sólo sirven para permitir que la salida de una aplicación sea la entrad de otra las fifo también llamadas tuberias con nombre (named pipes) nos permiten además de esta redirección de la salida estandar una redirección de cualquier dato de salida que pueda ser grabado a disco.

Esto es particularmente útil para aplicaciones o grupos de aplicaciones que no soportan tuberias en linea.

Ejemplo:

$ mkfifo mififo
$ lame -q 2 -b 128 mififo output.mp3
$ mplayer input.rm -ao pcm -aofile mififo

Con esto podemos convertir ficheros en formato Real media a mp3

Es posible crear tuberias con nombre empleando el comando mknod, de hecho era el método utilizado para crearlas antes de la aparición del comando mkfifo para simplificar esta tarea.

Mas información en:

Linux Journal
Unix review