La définition d' APCU_CAS est la suivante:
bool apcu_cas(string $key, int|float $old, int|float $new)
La fonction de cette fonction est: si la valeur actuelle de la clé de clé $ est égale à $ old , sa valeur est définie sur $ nouveau et renvoie true ; Sinon, il renvoie faux .
Il convient de noter qu'il ne peut être utilisé que pour les valeurs des types numériques ( int ou float ) ou que l'opération échouera.
apcu_store('counter', '5');
$result = apcu_cas('counter', 5, 10);
Description de la question:
Alors que «5» ressemble à un nombre, dans APCU_CAS , la vérification de type est stricte. La chaîne «5» n'est pas égale à l'entier 5 , donc l'opération CAS échouera.
Solution:
Assurez-vous d'utiliser le type numérique lors du stockage:
apcu_store('counter', 5);
Ou cast avant la comparaison:
$value = apcu_fetch('counter');
if (is_numeric($value)) {
apcu_store('counter', (int)$value);
}
apcu_store('rate', 1.0);
apcu_cas('rate', 1, 2.0);
Description de la question:
Bien que 1 et 1,0 soient mathématiquement égaux, APCU_CAS prendra également le type en compte lors de la comparaison, et INT et Float incohérents conduisent à l'échec de comparaison.
Solution:
À l'aide d'un type numérique cohérent, il est recommandé de passer les paramètres en fonction du type de valeur d'origine:
$value = apcu_fetch('rate');
if (is_float($value)) {
apcu_cas('rate', 1.0, 2.0);
}
apcu_delete('score');
$result = apcu_cas('score', 0, 1);
Description de la question:
Si la clé n'existe pas, APCU_CAS renvoie directement False et aucune nouvelle valeur de clé ne sera créée. Cela peut amener les développeurs à croire à tort que la défaillance de l'opération est due à des valeurs différentes, plutôt qu'à la non-existence de la clé.
Solution:
Avant d'appeler APCU_CAS , utilisez APCU_EXISTS ou APCU_FETCH pour confirmer si la clé existe:
if (apcu_exists('score')) {
apcu_cas('score', 0, 1);
} else {
apcu_store('score', 1);
}
Utilisez toujours INT ou Float pour stocker les valeurs numériques, en évitant d'utiliser des nombres liés à la chaîne. Une couche de logique de rédaction de données peut être encapsulée:
function set_numeric_apcu(string $key, int|float $value): void {
apcu_store($key, $value);
}
Créez une fonction de wrapper sûre pour assurer le même type, puis exécuter APCU_CAS :
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);
}
Dans un environnement simultané, le processus d'initialisation des valeurs doit être clair et clair. Vous pouvez vous assurer que la clé existe et que le type est correct selon les méthodes suivantes:
$key = 'counter';
if (!apcu_exists($key)) {
apcu_add($key, 0);
}
Voici un exemple complet montrant comment utiliser les APCU_CAS pour en toute sécurité automatique:
$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 "Les visites actuelles ont été mises à jour。Veuillez visiter pour plus de détails: <a href=\"$url\">$url</a>";