APCU_CAS 의 정의는 다음과 같습니다.
bool apcu_cas(string $key, int|float $old, int|float $new)
이 함수의 기능은 다음과 같습니다. 키 $ 키 의 현재 값이 $ old 와 같으면 그 값은 $ 새로 설정되어 true를 반환합니다. 그렇지 않으면 false를 반환합니다.
수치 유형 ( int 또는 float )의 값에만 사용될 수 있거나 작동이 실패 할 수 있습니다.
apcu_store('counter', '5');
$result = apcu_cas('counter', 5, 10);
질문 설명 :
'5'는 숫자처럼 보이지만 apcu_cas 내부에서는 유형 확인이 엄격합니다. 문자열 '5'는 정수 5 와 같지 않으므로 CAS 작업이 실패합니다.
해결책:
저장시 숫자 유형을 사용하십시오.
apcu_store('counter', 5);
또는 비교 전에 캐스트 :
$value = apcu_fetch('counter');
if (is_numeric($value)) {
apcu_store('counter', (int)$value);
}
apcu_store('rate', 1.0);
apcu_cas('rate', 1, 2.0);
질문 설명 :
1 과 1.0 은 수학적으로 동일하지만 APCU_CAS는 비교할 때 유형을 고려하고 일관성이없는 int 와 플로트는 비교 실패로 이어집니다.
해결책:
일관된 숫자 유형을 사용하여 원래 값의 유형에 따라 매개 변수를 전달하는 것이 좋습니다.
$value = apcu_fetch('rate');
if (is_float($value)) {
apcu_cas('rate', 1.0, 2.0);
}
apcu_delete('score');
$result = apcu_cas('score', 0, 1);
질문 설명 :
키가 존재하지 않으면 APCU_CAS는 직접 False를 반환하고 새로운 키 값이 생성되지 않습니다. 이로 인해 개발자는 운영 실패가 키의 존재하지 않는 것이 아니라 다른 값으로 인한 것이라고 잘못 믿게 될 수 있습니다.
해결책:
APCU_CAS 에 전화하기 전에 APCU_EXISSS 또는 APCU_FETCH를 사용하여 키가 존재하는지 확인하십시오.
if (apcu_exists('score')) {
apcu_cas('score', 0, 1);
} else {
apcu_store('score', 1);
}
String-denoted 숫자를 사용하지 않고 항상 int 또는 float를 사용하여 숫자 값을 저장하십시오. 데이터 작성 논리의 한 층은 다음과 같이 캡슐화 할 수 있습니다.
function set_numeric_apcu(string $key, int|float $value): void {
apcu_store($key, $value);
}
동일한 유형을 보장하기 위해 안전한 래퍼 기능을 작성한 다음 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);
}
동시 환경에서 값을 초기화하는 과정은 명확하고 명확해야합니다. 키가 존재하고 다음 방법으로 유형이 올바른지 확인할 수 있습니다.
$key = 'counter';
if (!apcu_exists($key)) {
apcu_add($key, 0);
}
다음은 APCU_CAS를 사용하여 안전하게 자동 증가하는 방법을 보여주는 완전한 예입니다.
$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 "현재 방문이 업데이트되었습니다。자세한 내용은 방문하십시오: <a href=\"$url\">$url</a>";