Start · Sprachen · PHP · Referenz · SyncMutex

SyncMutex

Klasse

Repräsentiert einen benannten Mutex (Mutual Exclusion Lock) zur Synchronisation zwischen Prozessen und Threads.

seit PHP 1.0.0 Kategorie: misc

Signatur

class SyncMutex

Beschreibung

SyncMutex ist Teil der Sync-PECL-Extension und stellt einen plattformübergreifenden, benannten Mutex bereit. Ein Mutex erlaubt es, kritische Code-Abschnitte so zu schützen, dass immer nur ein Prozess oder Thread gleichzeitig auf eine gemeinsame Ressource zugreift.

Im Gegensatz zu dateibasierten Sperren (z. B. flock()) funktioniert SyncMutex auch prozessübergreifend und ohne eine gemeinsame Datei. Der Mutex wird über einen eindeutigen Namen identifiziert, sodass verschiedene PHP-Prozesse denselben Mutex referenzieren und sich damit synchronisieren können.

Typische Einsatzgebiete sind z. B. der exklusive Zugriff auf eine Datenbankverbindung, das Schreiben in eine Datei durch mehrere Prozesse oder die Steuerung von Worker-Prozessen in einer Job-Queue. Der Mutex unterstützt sowohl blockierendes als auch nicht-blockierendes Locking mit einem optionalen Timeout.

Wichtig: SyncMutex setzt die PECL-Extension sync voraus, die separat installiert werden muss (pecl install sync).

Parameter

Name Typ Default Beschreibung
$name string Optionaler, eindeutiger Name des Mutex. Unter Windows wird ein globales Kernel-Objekt angelegt; unter Unix ein POSIX-Semaphor. Wird kein Name angegeben, ist der Mutex nur innerhalb desselben Prozesses nutzbar.

Rückgabewert

Typ

Beispiele

Exklusiven Zugriff auf eine Datei mit SyncMutex schützen

<?php
// Beide Prozesse verwenden denselben Mutex-Namen
$mutex = new SyncMutex('MyApp_FileLock');

// Blockierendes Lock (wartet maximal 5000 ms)
if ($mutex->lock(5000)) {
    try {
        // Kritischer Abschnitt: exklusiver Dateizugriff
        $fp = fopen('/tmp/shared_log.txt', 'a');
        fwrite($fp, date('Y-m-d H:i:s') . ' - Eintrag von PID ' . getmypid() . "\n");
        fclose($fp);
    } finally {
        // Mutex in jedem Fall freigeben
        $mutex->unlock();
    }
} else {
    echo "Konnte den Mutex nicht innerhalb von 5 Sekunden aquirieren.\n";
}

Nicht-blockierendes Lock (Trylock-Muster)

<?php
$mutex = new SyncMutex('MyApp_JobQueue');

// Timeout 0 = sofortiger Rückgabewert ohne Warten
if ($mutex->lock(0)) {
    echo "Lock erhalten – verarbeite Job...\n";
    // ... Job-Logik ...
    $mutex->unlock();
} else {
    echo "Ein anderer Prozess verarbeitet bereits den Job.\n";
}
Lock erhalten – verarbeite Job...

// Wichtig · Fallstricke

Rekursive Locks: Unter Windows unterstützt SyncMutex rekursives Locking (derselbe Prozess/Thread kann den Mutex mehrfach sperren). Jedes lock() muss dann mit einem entsprechenden unlock() gepaart werden. Unter Unix (POSIX) ist dies nicht der Fall – ein erneutes lock() aus demselben Thread führt zu einem Deadlock.

Deadlock-Gefahr: Wird unlock() nicht aufgerufen (z. B. durch eine nicht abgefangene Exception), bleibt der Mutex dauerhaft gesperrt. Verwende daher immer try/finally, um das Entsperren sicherzustellen.

Plattformunterschiede: Auf Windows-Systemen werden benannte Mutexe als Kernel-Objekte angelegt. Auf Unix-Systemen werden POSIX-Semaphoren verwendet. Das Verhalten bei Prozessabbrüchen (z. B. kill -9) kann sich plattformspezifisch unterscheiden.

Verfügbarkeit: SyncMutex ist kein Bestandteil des PHP-Kerns, sondern erfordert die PECL-Extension sync (>= 1.0.0).