In der PHP -Entwicklungspraxis werden häufig APCU -Erweiterungen verwendet, um Daten zwischen Anforderungen zu teilen. Da der gemeinsame Gedächtnismechanismus von PHP jedoch durch sein laufendes Modell (insbesondere den Multi-Process-Modus von FPM oder Apache) begrenzt ist, verstehen Entwickler häufig "Multi-Process-gemeinsame Cache". In diesem Artikel wird untersucht, wie die gemeinsame Nutzung von APCU-Cache in einem typischen Multi-Process-Programm über die Funktion apcu_entry implementiert wird.
APCU (Alternativer PHP -Cache -Benutzer) ist ein Benutzer -Cache -Modul von PHP, das das Daten zwischen dem Datenspeicher basierend auf dem gemeinsamen Speicher implementiert. Es ist für den CLI-Modus und den Web-Modus geeignet, hat jedoch eine Einschränkung: Unter dem Multi-Process-Modell wird der variable Speicherplatz zwischen jedem PHP-Prozess nicht gemeinsam genutzt, und die APCU-Freigabe hängt von der Speicherzuordnung ab .
Dies bedeutet, dass alle Prozesse, solange PHP denselben APCU -Speicherbereich verwendet, in diesem gemeinsam genutzten Speicher auf zwischengespeicherte Daten zugreifen können. Obwohl der variable Umfang isoliert ist, ist der Cache nicht.
apcu_entry ist eine in PHP 5.5+ eingeführte Funktion, um Cache -Elemente zu erhalten oder zu generieren. Die typische Verwendung ist wie folgt:
$value = apcu_entry('cache_key', function() {
return some_expensive_function();
});
Sein Arbeitsprinzip ist:
Überprüfen Sie, ob cache_key existiert;
Wenn es existiert, kehren Sie direkt zurück.
Wenn es nicht existiert, führen Sie die Funktion im Verschluss aus, zwischen dem Ergebnis und senden Sie sie zurück.
Diese Strategie "Lazy Computing + Caching" eignet sich sehr für die Anforderungen an die Ressourcenfreigabe in mehreren Prozessen.
Wenn wir beispielsweise PCPS- PCNTL_FORK nehmen, simulieren wir ein Multi-Process-Szenario, um zu überprüfen, ob der Cache gemeinsam genutzt wird:
<?php
if (!extension_loaded('apcu')) {
die("APCu Erweiterung nicht aktiviert\n");
}
apcu_clear_cache();
$pid = pcntl_fork();
if ($pid == -1) {
die("Es kann keinen Kinderprozess erstellen\n");
} elseif ($pid === 0) {
// Subprozess
$data = apcu_entry('shared_key', function () {
echo "Subprozess:Cache Miss,Daten generieren\n";
return 'Subprozess写入的数据 ' . time();
});
echo "Subprozess读取缓存:$data\n";
} else {
// Elternprozess
sleep(1); // 等待Subprozess先执行
$data = apcu_entry('shared_key', function () {
echo "Elternprozess:Cache Miss,Daten generieren\n";
return 'Elternprozess写入的数据 ' . time();
});
echo "Elternprozess读取缓存:$data\n";
}
Normalerweise sehen Sie:
Subprozess:Cache Miss,Daten generieren
Subprozess读取缓存:Subprozess写入的数据 1715600000
Elternprozess读取缓存:Subprozess写入的数据 1715600000
Dies zeigt, dass der zwischengespeicherte Inhalt von APCU tatsächlich zwischen Eltern- und Kinderprozessen geteilt wird.
Stellen Sie sicher, dass PHP dieselbe SAPI verwendet (z. B. Ausführen mehrerer untergeordneter Prozesse im CLI -Modus) .
Bestätigen Sie, dass apc.enable_cli = 1 in php.ini aktiviert ist , andernfalls wird APCU im CLI -Modus nicht aktiviert.
APCU eignet sich nicht für die Freigabe von Cache (z. B. mehrere PHP-Instanzen unter Lastausgleich) . Wenn Sie einen Multi-Machine-Cache benötigen, verwenden Sie bitte Redis, Memcached und andere Dienste.
Vermeiden Sie die Abhängigkeit von Cache Persistenz . APCU ist ein Cache auf Prozessebene, und das Neustart von PHP-FPM führt zu Datenverlust.
Angenommen, wir erhalten Konfigurationsdaten von der Remote -API:
$config = apcu_entry('remote_config', function () {
echo "Holen Sie sich Daten von der Remote -Schnittstelle ab...\n";
$json = file_get_contents('https://gitbox.net/api/config');
return json_decode($json, true);
});
Solange der Cache nicht abgelaufen ist, ruft kein Prozess diese Logik auf und fordert die Schnittstelle wiederholt an. Dies verbessert die Leistung erheblich und verringert die Anzahl der Remote -Anrufe.
APCU_ENTRY bietet einen eleganten Caching -Mechanismus, insbesondere für Szenarien, in denen "hohe Rechenkosten oder hohe Anrufkosten" geeignet sind. In einem Multi-Process-PHP-Programm kann der zwischengespeicherte Inhalt von APCU zwischen den Prozessen geteilt werden, solange es sich um die laufende Umgebung handelt. Das Verständnis der Betriebsprinzipien und -beschränkungen hilft Ihnen dabei, Hochleistungs-PHP-Anwendungen effizienter aufzubauen.