Bei Verwendung der APCU -Cache -Erweiterung von PHP kommen Entwickler häufig mit den beiden Funktionen in Kontakt: apcu_entry () und apcu_add () . Sie alle werden verwendet, um Daten in den Cache zu schreiben, aber es gibt offensichtliche Unterschiede im Verhalten und anwendbaren Szenarien. In diesem Artikel werden die Unterschiede zwischen den beiden aus den Perspektiven der Implementierungsprinzipien, der Nutzungsszenarien und der Leistung analysiert und sie in Kombination mit tatsächlichen Beispielen erläutern.
apcu_add (String $ Key, gemischt $ var, int $ ttl = 0): bool
Diese Funktion fügt dem Cache einen Wert hinzu, und wenn der angegebene $ -Kaste bereits vorhanden ist, schlägt der Zugabe fehl und gibt False zurück. Dies bedeutet, dass apcu_add () ein "nur einmal hinzufügen" -Operation ist, der häufig für die Initialisierung oder Szenarien verwendet werden, die vermieden werden müssen.
apcu_entry (String $ Key, Callable $ generator, int $ ttl = 0): gemischt
Diese Funktion versucht, den Wert $ Key aus dem Cache zu erhalten. Wenn der Schlüssel nicht vorhanden ist, wird die Callback -Funktion $ generator aufgerufen, um Daten zu generieren und in den Cache zu schreiben. Sein typischer Zweck ist es, Szenarien zu "faul", um wiederholte teure Vorgänge zu vermeiden.
Bestimmen Sie, ob der Schlüssel existiert:
apcu_add () ist atomic, versucht direkt hinzuzufügen, und kehrt zurück, wenn der Schlüssel bereits vorhanden ist, wodurch Leseschreiberrennen vermieden werden.
Apcu_entry () versucht zuerst zu lesen, wenn es vermisst wird, dann rufen Sie dann auf, Daten zu generieren und zu schreiben. Dies kann zu wiederholten Berechnungen unter Parallelität führen (obwohl die tatsächliche Wahrscheinlichkeit des Auftretens niedrig ist).
Verhalten schreiben:
apcu_add () wird den vorhandenen Wert niemals überschreiben und eignet sich für Situationen, in denen Sie nur "einmal festlegen" möchten.
apcu_entry () berechnet automatisch und schreibt, wenn der Cache nicht vorhanden ist und für faule Laden geeignet ist.
Einfachheit:
apcu_entry () liefert eine klarere Kapselungsstruktur, und eine Codezeile implementiert die Cache -Lese- + Generationslogik bei ungültiger Semantik.
APCU_ADD () verlangt vom Entwickler, die Les- und Urteilslogik manuell zu schreiben.
$config = [
'site_name' => 'GitBox',
'max_upload' => 100
];
$key = 'site_config';
if (!apcu_add($key, $config, 3600)) {
// Existiert bereits,Es wird keine Behandlung durchgeführt
}
Geeignet für Konfigurationsdaten, die in der Bereitstellungs- oder Initialisierungsphase geschrieben wurden, um sicherzustellen, dass sie nicht wiederholt festgelegt oder überschrieben werden.
$data = apcu_entry('user_list', function() {
// Nehmen Sie an, diese Funktion fragt die Datenbank ab
return file_get_contents('https://gitbox.net/api/users');
}, 600);
Hier erhält User_List Daten und richtet sie durch die Access -API ab, wenn sie nicht vorhanden ist, sodass sie ideal zum häufigsten Lesen, aber gelegentlich geändert werden.
Szene | Verwenden Sie apcu_add () | Verwenden Sie apcu_entry () |
---|---|---|
Einstellungen initialisieren | ? | ? |
Vermeiden Sie die Abdeckung | ? | ? |
Automatisch generiert | ? | ? |
Faules Laden | ? | ? |
Vereinfachen Sie die Cache -Logik | ? | ? |
In einer hohen Parallelitätsumgebung ist die interne Logik nicht stark konsistent. Mehrere Prozesse können gleichzeitig bestimmen, dass der Schlüssel nicht existiert und Daten generiert. Wenn der Rückruf teuer ist oder das Ergebnis eindeutig sein muss, wird empfohlen, einen Sperrmechanismus hinzuzufügen oder apcu_add () zu verwenden, um das Urteilsvermögen zu unterstützen.
$key = 'report_2025';
if (!apcu_add($key, true, 300)) {
// Die Aufgabe wurde in einem anderen Prozess ausgeführt
return;
}
generateExpensiveReport(); // Einfach einmal ausführen
Die Verwendung von apcu_add () ist die beste Wahl, wenn Sie nur einmal ein Schreiben ausführen möchten.
Die Verwendung von apcu_entry () ist eine effizientere Möglichkeit, Ergebnisse automatisch aus Berechnungen zu erhalten und zu cache.
Wenn Sie den Unterschied verstehen, können Sie die Cache -Logik von PHP rationaler entwerfen, die Anwendungsleistung verbessern und den Ressourcenverbrauch verringern.