Die Definition von apcu_cas lautet wie folgt:
bool apcu_cas(string $key, int|float $old, int|float $new)
Die Funktion dieser Funktion lautet: Wenn der aktuelle Wert des Schlüsselschlüssels $ old gleich ist, wird sein Wert auf $ New festgelegt und kehrt true zurück. Ansonsten kehrt es falsch zurück.
Es ist erwähnenswert, dass es nur für Werte von numerischen Typen ( int oder float ) verwendet werden kann oder die Operation fehlschlägt.
apcu_store('counter', '5');
$result = apcu_cas('counter', 5, 10);
Frage Beschreibung:
Während '5' wie eine Nummer in APCU_CAS aussieht, ist das Typ -Checking streng. Die Zeichenfolge '5' entspricht nicht der Ganzzahl 5 , sodass die CAS -Operation fehlschlägt.
Lösung:
Stellen Sie sicher, dass Sie den numerischen Typ beim Speichern verwenden:
apcu_store('counter', 5);
Oder vor dem Vergleich gegossen:
$value = apcu_fetch('counter');
if (is_numeric($value)) {
apcu_store('counter', (int)$value);
}
apcu_store('rate', 1.0);
apcu_cas('rate', 1, 2.0);
Frage Beschreibung:
Obwohl 1 und 1.0 mathematisch gleich sind, berücksichtigt APCU_CAS den Typ auch beim Vergleichen, und inkonsistent und float führen zum Vergleichsfehler.
Lösung:
Unter Verwendung eines konsistenten numerischen Typs wird empfohlen, Parameter entsprechend dem Typ des ursprünglichen Wertes zu übergeben:
$value = apcu_fetch('rate');
if (is_float($value)) {
apcu_cas('rate', 1.0, 2.0);
}
apcu_delete('score');
$result = apcu_cas('score', 0, 1);
Frage Beschreibung:
Wenn der Schlüssel nicht vorhanden ist, gibt APCU_CAS direkt False zurück und es wird kein neuer Schlüsselwert erstellt. Dies kann dazu führen, dass Entwickler fälschlicherweise glauben, dass der Operationsversagen eher auf unterschiedliche Werte als auf die Nichtbelegung des Schlüssels zurückzuführen ist.
Lösung:
Verwenden Sie vor dem Aufrufen von apcu_cas apcu_exists oder apcu_fetch, um zu bestätigen, ob der Schlüssel vorhanden ist:
if (apcu_exists('score')) {
apcu_cas('score', 0, 1);
} else {
apcu_store('score', 1);
}
Verwenden Sie immer int oder float, um numerische Werte zu speichern und zu vermeiden, und die Verwendung von String-denotierten Zahlen vermeiden. Eine Schreibschicht kann verkapselt werden:
function set_numeric_apcu(string $key, int|float $value): void {
apcu_store($key, $value);
}
Erstellen Sie eine sichere Wrapper -Funktion, um den gleichen Typ zu gewährleisten und dann apcu_cas auszuführen:
function safe_apcu_cas(string $key, int|float $old, int|float $new): bool {
$current = apcu_fetch($key);
if (gettype($current) !== gettype($old)) {
return false;
}
return apcu_cas($key, $old, $new);
}
In einer gleichzeitigen Umgebung sollte der Prozess der Initialisierung von Werten klar und klar sein. Sie können sicherstellen, dass der Schlüssel existiert und der Typ mit den folgenden Methoden korrekt ist:
$key = 'counter';
if (!apcu_exists($key)) {
apcu_add($key, 0);
}
Hier ist ein vollständiges Beispiel, das zeigt, wie apcu_cas verwendet wird, um sicher automatisch inkrementiert zu werden:
$key = 'visit_counter';
do {
$old = apcu_fetch($key);
if ($old === false) {
if (apcu_add($key, 1)) {
break;
} else {
continue;
}
}
$new = $old + 1;
} while (!apcu_cas($key, $old, $new));
$url = 'https://gitbox.net/stats';
echo "Aktuelle Besuche wurden aktualisiert。Bitte besuchen Sie Details: <a href=\"$url\">$url</a>";