PHP Handbuch
Zurück |  | Nach vorne

# LXXXVIII. 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);
    ?>

Zurück | Zum Anfang | Nach vorne
satellite_get_repository_id | Nach oben | sem_get