Start · Sprachen · PHP · Referenz · Yac

Yac

Klasse

Bietet einen schnellen Nutzerdaten-Cache im Shared Memory über die PECL-Erweiterung <code>yac</code>.

Kategorie: misc

Signatur

class Yac

Beschreibung

Yac (Yet Another Cache) ist eine PECL-Erweiterung, die einen Lock-freien Shared-Memory-Cache für PHP-Nutzerdaten bereitstellt. Im Gegensatz zu APCu oder Memcache verzichtet Yac auf Sperrmechanismen (Locks), was es besonders schnell macht – auf Kosten eines möglichen, aber tolerablen Datenverlusts unter extremer Last.

Der Cache lebt im gemeinsamen Speicher des Betriebssystems und ist daher über alle PHP-Prozesse und Worker hinweg zugänglich. Er eignet sich besonders für kurzlebige, schnell regenerierbare Daten wie Session-Fragmente, Konfigurationsdaten oder häufig abgefragte Datenbankresultate, bei denen ein gelegentlicher Cache-Miss kein Problem darstellt.

Yac serialisiert PHP-Werte automatisch, bevor sie im Shared Memory abgelegt werden. Unterstützt werden Skalare, Arrays und serialisierbare Objekte. Ressourcen und Closures können nicht gecacht werden. Die Größe des Shared-Memory-Segments wird über php.ini-Direktiven (yac.keys_memory_size und yac.values_memory_size) konfiguriert.

Die Klasse wird direkt instantiiert und arbeitet mit einem optionalen Präfix, um Namenskonflikte zwischen verschiedenen Anwendungen oder Modulen zu vermeiden. Typische Methoden sind set(), get(), delete() und flush().

Parameter

Name Typ Default Beschreibung
$prefix string "" Optionaler Präfix, der allen Cache-Schlüsseln dieser Instanz vorangestellt wird. Hilft, Namenskollisionen zwischen verschiedenen Anwendungen oder Modulen zu vermeiden.

Beispiele

Einfaches Setzen und Abrufen von Werten

<?php
// Yac-Instanz mit einem Anwendungs-Präfix erstellen
$cache = new Yac('myapp_');

// Wert mit einer TTL von 60 Sekunden speichern
$cache->set('user_42', ['name' => 'Alice', 'role' => 'admin'], 60);

// Wert abrufen
$user = $cache->get('user_42');
if ($user !== false) {
    echo 'Name: ' . $user['name'] . PHP_EOL;
    echo 'Rolle: ' . $user['role'] . PHP_EOL;
} else {
    echo 'Cache-Miss – Daten aus DB laden.' . PHP_EOL;
}
Name: Alice Rolle: admin

Mehrere Werte gleichzeitig setzen und abrufen

<?php
$cache = new Yac('config_');

// Mehrere Schlüssel auf einmal setzen
$cache->set([
    'db_host' => '127.0.0.1',
    'db_port' => 3306,
    'debug'   => false,
], 300);

// Mehrere Schlüssel auf einmal abrufen
$values = $cache->get(['db_host', 'db_port', 'debug']);
print_r($values);

// Einzelnen Schlüssel löschen
$cache->delete('debug');

// Gesamten Präfix-Bereich leeren
$cache->flush();
Array ( [db_host] => 127.0.0.1 [db_port] => 3306 [debug] => )

// Wichtig · Fallstricke

Lock-freies Design: Yac verwendet keine Mutex-Locks. Unter sehr hoher Schreiblast ist es theoretisch möglich, dass ein gerade geschriebener Eintrag von einem anderen Prozess überschrieben wird. Das System ist daher nur für Daten geeignet, bei denen gelegentliche Inkonsistenz oder ein Cache-Miss toleriert werden kann.

Kein persistenter Speicher: Der Shared-Memory-Bereich wird beim Neustart des Webservers oder PHP-FPM-Prozesses geleert. Yac ist kein Ersatz für persistente Speicherlösungen wie Redis oder Memcached.

Speicherkonfiguration: Die Direktiven yac.keys_memory_size (Standard: 4 MB) und yac.values_memory_size (Standard: 64 MB) müssen in der php.ini ausreichend groß gewählt werden. Zu kleiner Speicher führt dazu, dass alte Einträge ohne Vorwarnung verdrängt werden.

Objekte: Beim Speichern von Objekten wird serialize() verwendet. Beim Abrufen werden die Objekte wiederhergestellt – die entsprechende Klasse muss daher zum Zeitpunkt des Abrufens geladen sein.