PHP의 APCU 캐시 확장을 사용하는 경우 개발자는 종종 APCU_ENTRY () 및 APCU_ADD () 의 두 기능과 접촉합니다. 그들은 모두 캐시에 데이터를 작성하는 데 사용되지만 행동과 해당 시나리오에는 명백한 차이가 있습니다. 이 기사는 구현 원리, 사용 시나리오 및 성능의 관점과의 차이점을 분석하고 실제 예와 함께 설명합니다.
apcu_add (String $ 키, 혼합 $ var, int $ ttl = 0) : bool
이 함수는 캐시에 값을 추가하고 지정된 $ 키가 이미 존재하면 추가가 실패하여 False를 반환합니다. 이는 APCU_ADD () 가 "한 번만 추가"작업이며, 종종 피해야하는 초기화 또는 시나리오에 종종 사용됩니다.
apcu_entry (문자열 $ 키, 호출 가능한 $ 생성기, int $ ttl = 0) : 혼합
이 기능은 캐시에서 $ 키 에 해당하는 값을 얻으려고합니다. 키가 존재하지 않으면 $ Generator 콜백 함수가 호출되어 데이터를 생성하고 캐시에 씁니다. 전형적인 목적은 반복적 인 비싼 작업을 피하기 위해 "게으른 부하"시나리오를 만드는 것입니다.
키가 존재하는지 확인하십시오.
apcu_add () 는 원자이며 직접 추가하려고 시도하며 키가 이미 존재하는 경우 읽기 쓰기 경주를 피합니다.
APCU_ENTRY ()는 먼저 그것을 읽으려고 시도합니다. 누락 된 경우 콜백을하여 데이터를 생성하고 쓰려고합니다. 이로 인해 동시성 하에서 반복 계산이 발생할 수 있습니다 (실제 발생 확률은 낮지 만).
행동 작성 :
apcu_add ()는 기존 값을 덮어 쓰지 않으며 "한 번만 설정하려는 상황에 적합합니다.
APCU_ENTRY ()는 캐시가 존재하지 않을 때 자동으로 계산 및 쓰기로, 게으른 하중에 적합합니다.
간단:
APCU_ENTRY ()는 더 명확한 캡슐화 구조를 제공하고 한 줄의 코드는 명확한 의미를 통해 무효화 될 때 캐시를 읽습니다 + 생성 로직을 읽습니다.
APCU_ADD () 는 개발자가 읽기 및 판단 논리를 수동으로 작성해야합니다.
$config = [
'site_name' => 'GitBox',
'max_upload' => 100
];
$key = 'site_config';
if (!apcu_add($key, $config, 3600)) {
// 이미 존재합니다,치료가 완료되지 않았습니다
}
배포 또는 초기화 단계에 작성된 구성 데이터에 적합하여 반복적으로 설정하거나 덮어 쓰지 않도록합니다.
$data = apcu_entry('user_list', function() {
// 이 기능이 데이터베이스를 쿼리한다고 가정하십시오
return file_get_contents('https://gitbox.net/api/users');
}, 600);
여기서 user_list는 데이터를 가져 와서 존재하지 않을 때 액세스 API를 통해 캐시합니다.
장면 | apcu_add () 사용 | apcu_entry () 사용 |
---|---|---|
설정 초기화 | ? | ? |
적용 범위를 피하십시오 | ? | ? |
자동으로 생성되었습니다 | ? | ? |
게으른 적재 | ? | ? |
캐시 로직을 단순화합니다 | ? | ? |
동시 동시성 환경에서는 APCU_ENTRY () 가 편리하지만 내부 논리는 강력하게 일관되지 않습니다. 여러 프로세스가 키가 존재하지 않는지 동시에 결정하고 데이터를 생성 할 수 있습니다. 따라서 콜백이 비싸거나 결과가 고유 한 경우 잠금 장치를 추가하거나 apcu_add ()를 사용하여 판단을 돕는 것이 좋습니다.
$key = 'report_2025';
if (!apcu_add($key, true, 300)) {
// 작업은 다른 프로세스에서 실행되었습니다
return;
}
generateExpensiveReport(); // 한 번만 실행하십시오
APCU_ADD ()를 사용하는 것이 한 번만 쓰기를 수행하려는 경우 최상의 선택입니다.
apcu_entry ()를 사용하는 것은 계산 결과를 자동으로 얻고 캐시하는보다 효율적인 방법입니다.
차이를 이해하면 PHP의 캐시 로직을보다 합리적으로 설계하고 응용 프로그램 성능을 향상 시키며 리소스 소비를 줄일 수 있습니다.