2011-12-25 24 views

Respuesta

31

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.

+0

¿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

+0

@outis, ¿Cuál es el equivalente de Windows? – Pacerier

+0

¿cómo funciona esto en el servidor de nodo múltiple? –

9

Cuando un proceso en ejecución solicita memoria, el sistema proporciona una porción de memoria a la que solo se puede acceder mediante el proceso asignado. Algunas veces ejecuta múltiples hilos y desea compartir datos entre ellos.

"El intercambio de datos" se puede hacer por:

  • de datos que pasan a través de tomas de corriente/tuberías
  • memoria compartida (hilos, procesos)

Desde pasar datos no es muy práctico en algunos casos, uno podría querer usar Shared memory.

Las funciones en cuestión proporcionan funcionalidad para manejar segmentos de memoria compartida en PHP.

+0

Entonces, ¿es básicamente inútil? Quiero decir, si puedes usar variables globales para eso, no tiene sentido interferir con esas funciones shmop_ * – Alex

+2

@Alex: PHP realmente no tiene "variables globales" como esa. Es un nombre inapropiado en PHP, ya que siempre tiene espacios de proceso separados. - Piense en shmop más como Memcache, excepto que es una característica del sistema POSIX/Unix, destinada a compartir entre aplicaciones PHP y C (si no fuera por la representación binaria no coincide, no puede encontrar ese duplicado). También puede imaginarlo como un ramdisk, de hecho, shmop generalmente crea una entrada de archivo en '/ etc/shm/*' – mario

+0

La memoria compartida es administrada por el sistema operativo. Tienen mucho más servicios de protección y control en comparación con el uso limitado de variables globales. La memoria compartida se usa principalmente para la comunicación entre procesos. Si no lo necesita explícitamente, apegue a las variables. – fuzzy