Start · Sprachen · PHP · Referenz · shm_has_var

shm_has_var

Funktion

Prüft, ob eine Variable mit dem angegebenen Schlüssel im Shared-Memory-Segment vorhanden ist.

seit PHP 4.0.3 Kategorie: misc

Signatur

shm_has_var(SysvSharedMemory $shm, int $key): bool

Beschreibung

shm_has_var() überprüft, ob im gegebenen Shared-Memory-Segment eine Variable unter dem numerischen Schlüssel $key gespeichert ist. Die Funktion gibt true zurück, wenn der Eintrag existiert, andernfalls false.

Shared Memory ermöglicht die effiziente Kommunikation zwischen mehreren PHP-Prozessen (z. B. bei parallelen Worker-Prozessen oder Daemon-Anwendungen). Bevor man mit shm_get_var() einen Wert ausliest, sollte man mit shm_has_var() prüfen, ob der Eintrag überhaupt vorhanden ist, um Fehler zu vermeiden.

Das Shared-Memory-Segment muss zuvor mit shm_attach() geöffnet worden sein. Die Schlüssel sind frei wählbare positive ganze Zahlen und dienen als interne Bezeichner für die gespeicherten Variablen innerhalb des Segments.

Diese Funktion ist Teil der System V Shared Memory-Erweiterung (sysvshm) und steht nur auf Systemen zur Verfügung, auf denen diese Erweiterung kompiliert wurde (typischerweise Unix/Linux-Systeme).

Parameter

Name Typ Default Beschreibung
$shm Pflicht SysvSharedMemory Eine Shared-Memory-Ressource, die zuvor mit shm_attach() erzeugt wurde.
$key Pflicht int Der numerische Schlüssel, unter dem die Variable im Shared-Memory-Segment gespeichert ist. Positive ganze Zahl, frei wählbar.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn eine Variable mit dem angegebenen Schlüssel im Shared-Memory-Segment vorhanden ist, andernfalls false.

Beispiele

Prüfen vor dem Lesen eines Shared-Memory-Eintrags

<?php
// Shared-Memory-Segment erstellen/öffnen (Key 0x1234, 1 MB)
$shm = shm_attach(0x1234, 1024 * 1024);

$varKey = 42;

// Variable setzen
shm_put_var($shm, $varKey, 'Hallo Welt');

// Prüfen, ob der Eintrag vorhanden ist, bevor er gelesen wird
if (shm_has_var($shm, $varKey)) {
    $wert = shm_get_var($shm, $varKey);
    echo "Wert gefunden: " . $wert . PHP_EOL;
} else {
    echo "Kein Eintrag unter diesem Schlüssel vorhanden." . PHP_EOL;
}

shm_detach($shm);
Wert gefunden: Hallo Welt

Lazy-Initialisierung eines Shared-Memory-Eintrags

<?php
$shm = shm_attach(ftok('/tmp/myapp', 'A'), 512 * 1024);

$counterKey = 1;

// Zähler initialisieren, falls noch nicht vorhanden
if (!shm_has_var($shm, $counterKey)) {
    shm_put_var($shm, $counterKey, 0);
    echo "Zähler wurde initialisiert." . PHP_EOL;
} else {
    $aktuell = shm_get_var($shm, $counterKey);
    shm_put_var($shm, $counterKey, $aktuell + 1);
    echo "Zähler inkrementiert: " . ($aktuell + 1) . PHP_EOL;
}

shm_detach($shm);
Zähler wurde initialisiert.

// Wichtig · Fallstricke

Plattformabhängigkeit: Die sysvshm-Erweiterung steht nur auf Unix/Linux-Systemen zur Verfügung. Unter Windows ist diese Funktion nicht verfügbar.

Race Conditions: Da mehrere Prozesse gleichzeitig auf dasselbe Shared-Memory-Segment zugreifen können, reicht die Prüfung mit shm_has_var() allein nicht aus, um Race Conditions zu verhindern. Für kritische Abschnitte sollte man zusätzlich sem_acquire() (System V Semaphore) zur Synchronisierung einsetzen.

Speicherverwaltung: Wenn ein Shared-Memory-Segment mit shm_remove() oder shm_remove_var() modifiziert wird, kann sich der Zustand zwischen shm_has_var() und einem nachfolgenden shm_get_var()-Aufruf ändern.