XC. Semaphor und Shared Memory Funktionen

Dieses Modul bietet Unterstützung für die Nutzung von Semaphoren und gemeinamen Speichersegmenten mit Hilfe der UNIX System V Mechanismen zur Interprozess-Kommunikation.

Mit Hilfe von Semaphoren kann der exklusive Zugriff auf Resourcen eines Systems sichergestellt oder die Anzahl der Prozesse begrenzt werden, die gleichzeitig eine bestimmte Systemresource nutzen.

Mit Hilfe gemeinsamer Speichersegmente (shared memory) können system-globale Variablen angelegt und bereitgestellt werden. Diese Speicherbereiche stehen allen Prozessen des Systems, insbesondere aber allen parallel laufenden PHP-Instanzen zum Datenaustausch zur Verfügung. Beachten Sie bitte, das gemeinsame Speichersegmente keinen Schutze vor konkurierenden gleichzeitigen Zugriffen bieten. Benutzen Sie Semaphore für die Koordination solcher Zugriffe.

Tabelle 1. Limits of Shared Memory by the Unix OS

SHMMAX Maximalgröße eines gemeinsamen Speicherbereichs, üblich sind 131072 Byte (128KB)
SHMMIN Minimalgröße eines gemeinsamen Speicherbereichs, normalerweise 1 Byte
SHMMNI maximale Anzahl unterschiedlicher Speichersegmente, üblich sind 100
SHMSEG Anzahl der Speichersegmente, die ein einzelner Prozess einbinden darf, üblich sind 6

Beispiel 1. Koordinierter Zugriff auf gemeinsamen Speicher

<?php
// gemeinsames Speichersegment beschaffen
if(! ($mkey = shm_attach(0x2328,1024,OctDec("666")))) 
{ echo "shmem_attach fehlgeschlagen<br>\n"; exit;}

// Semaphor für Zugriffskoordination auf 
// Speichersegment beschaffen
if(! ($skey = sem_get(0x2328,1,OctDec("666")))) 
{ echo "sem_get fehlgeschlagen<br>\n"; exit;}

// Zugriff anfordern
if(! sem_acquire($skey))
{ echo "sem_acquire fehlgeschlagen<br>\n"; exit;}

// Wert lesen, aktualisieren und schreiben
$val = @shm_get_var($mkey,1);
if($val===false) $val=1; else $val++;
print "new value is $val<br>\n";
shm_put_var($mkey,1,$val);

// Zugriff freigeben
sem_release($skey);
?>

Inhaltsverzeichnis
ftok --  Convert a pathname and a project identifier to a System V IPC key
msg_get_queue --  Create or attach to a message queue
msg_receive --  Receive a message from a message queue
msg_remove_queue --  Destroy a message queue
msg_send --  Send a message to a message queue
msg_set_queue --  Set information in the message queue data structure
msg_stat_queue --  Returns information from the message queue data structure
sem_acquire -- Zugriff auf einen Semaphore anfordern
sem_get -- Liefert ein Semaphore-Handle
sem_release -- Freigabe eines angeforderten Semaphores
sem_remove -- Remove a semaphore
shm_attach --  Anlegen oder anbinden eines gemeinsamen Speichersegments
shm_detach --  Beenden der Anbindung an ein gemeinsames Speichersegment
shm_get_var --  Liest einen in einem gemeinsamen Speicherbereich angelegten Wert.
shm_put_var --  Aktualisiert einen in einem gemeinsamen Speicherbereich angelegten Wert.
shm_remove_var --  Entfernt einen in einem gemeinsamen Speicherbereich angelegten Wert.
shm_remove -- Entfernt ein gemeinsames Speichersegment