La memoria compartida permite que múltiples procesos accedan a los mismos datos en la memoria. Puede usarlo para compartir datos entre ejecuciones de scripts PHP.
$shm = shmop_open(0xF00, "c", 0644, 4);
$count = unpack('L', shmop_read($shm, 0, 4));
$count = reset($count);
var_dump($count);
echo "count: ", $count++, "<br/>\n";
shmop_write($shm, pack('L', $count), 0);
Cuando se reinicia la computadora, se pierde todo en la memoria compartida.
Diferentes procesos pueden acceder a la misma memoria compartida al mismo tiempo, lo que puede llevar a race conditions. En el ejemplo anterior, si dos procesos leen la memoria compartida antes de que cualquiera vuelva a escribir, el recuento será 1 menos de lo que debería ser. Las condiciones de carrera se pueden prevenir mediante el uso de un mutex, pero que está fuera del alcance de esta Q & A.
Memoria compartida se utiliza para un tipo de inter-process communication, es decir que pasa de datos. Algunos otros disponibles en PHP (dependiendo de la plataforma y la instalación de PHP) son:
- señales (
posix_kill
para enviar una señal, pcntl_signal
para configurar un manejador de señales), un tipo limitado de paso de mensajes. Las señales no son particularmente útiles en las páginas con guiones, ya que cada secuencia de comandos debe ejecutarse durante un tiempo muy corto.
- Sockets para los datos. Los sockets pueden usar una red, o pueden ser locales.
- Tubos de datos.
posix_mkfifo
se utiliza para crear named pipes (aka FIFOs), y las funciones estándar file se utilizan para leer y escribir datos. Se pueden crear conductos sin nombre (aka anonymous) entre procesos padre e hijo usando popen
o proc_open
. Tenga en cuenta que las tuberías sin nombre no se pueden crear entre procesos arbitrarios. Tenga en cuenta que las tuberías en algunos sistemas son unidireccionales: un asa de tubo puede usarse para leer o escribir, pero no para ambos.
- Semaphores para synchronization.
- Colas de mensajes para messaging. En PHP, la extensión de semáforo ofrece colas de mensajes y otro conjunto de funciones de memoria compartida (por ejemplo,
shm_attach
). También hay disponibles muchas otras extensiones para varios protocolos de mensajería, incluidos SAM, STOMP y AMQP. Consulte "Other Services" en el manual de PHP para, bueno, otros.
- Red stream wrappers para los datos. En un nivel inferior, estos son solo enchufes, aunque proporcionan una interfaz diferente. También son para protocolos de nivel de aplicación específicos, mientras que los sockets son más generales.
- Network protocol extensions, como cURL, para mensajes & de datos. Al igual que los contenedores de flujo, estos son sockets (limitados) disfrazados.
- Web service extensions, como SOAP y XML-RPC, para remote procedure calls (RPC). Tenga en cuenta que, si bien estos están basados en un socket, son para un tipo diferente de IPC (RPC en lugar de datos).
Mientras que los sockets (y cualquier cosa basada en ellos, como las envolturas de flujo) y las tuberías se pueden utilizar para pasar datos entre procesos, sus capacidades con más de dos procesos son limitadas. Los enchufes solo pueden conectar dos procesos; para manejar más de dos, se deben abrir múltiples sockets (que es donde normalmente entra una arquitectura cliente-servidor). Con tuberías, solo un proceso puede read given data; una vez que lo haya hecho, esos datos no estarán disponibles para otros lectores, aunque pueden leer otros datos (que luego dejarán de estar disponibles para todos menos para el lector). Un número arbitrario de procesos puede abrir la misma región de memoria compartida.
¿Hay una buena manera de hacer que el proceso de recepción reaccione a un mensaje, de modo que se convierta en un evento? – CMCDragonkai
@outis, ¿Cuál es el equivalente de Windows? – Pacerier
¿cómo funciona esto en el servidor de nodo múltiple? –