Signatur
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
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);
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);
// 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.