LXXVI. 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
sem_get — Liefert ein Semaphore-Handle
sem_acquire — Zugriff auf einen Semaphore anfordern
sem_release — Freigabe eines angeforderten Semaphores
shm_attach — Anlegen oder anbinden eines gemeinsamen Speichersegments
shm_detach — Beenden der Anbindung an ein gemeinsames Speichersegment
shm_remove — Entfernt ein gemeinsames Speichersegment
shm_put_var — Aktualisiert einen in einem gemeinsamen Speicherbereich angelegten Wert.
shm_get_var — Liest einen in einem gemeinsamen Speicherbereich angelegten Wert.
shm_remove_var — Entfernt einen in einem gemeinsamen Speicherbereich angelegten Wert.