현재 위치: > 최신 기사 목록> APCU_ENTRY의 캐시 만료로 인한 성능 문제를 피하는 방법

APCU_ENTRY의 캐시 만료로 인한 성능 문제를 피하는 방법

gitbox 2025-05-20

동시 PHP 응용 분야에서는 캐시의 합리적인 사용이 성능을 향상시키는 핵심 수단입니다. APCU는 독립형 환경에서 중간 데이터 캐시에 적합한 메모리 레벨 캐시입니다. 빠른 응답이며 사용하기 쉽습니다. 그러나 캐시의 수명주기도 제한되어 있으며, 데이터가 만료되거나 지워지면 캐시 눈사태 또는 순간 동시 병목 현상이 부적절하게 처리되면 순간 동시 병목 현상으로 이어질 수 있습니다.

이 기사는 APCU_ENTRY () 함수를 사용하는 방법을 소개하고이를 사용하여 캐시가 만료 될 때 발생할 수있는 성능 문제를 우아하게 해결하는 방법을 탐색합니다.

apcu_entry 소개

APCU_ENTRY () 는 PHP 5.5+에 도입 된 함수이며 그 기능은 다음과 같습니다.

  • 캐시에서 키 값을 얻으십시오.

  • 존재하지 않는 경우, 캐시는 제공된 콜백 함수를 사용하여 계산 및 작성됩니다.

  • 캐시 된 값을 반환합니다.

기본 구문은 다음과 같습니다.

 mixed apcu_entry(string $key, callable $callback, int $ttl = 0)
  • $ 키 : 캐시 키;

  • $ 콜백 : 캐시가 존재하지 않을 때 실행되는 함수는 값을 생성하는 데 사용됩니다.

  • $ ttl : 캐시의 유효한 시간 (초), 기본 0은 영구적으로 유효 함을 의미합니다 (메모리가 지워지거나 스크립트가 끝날 때까지).

캐시 고장을 피하는 우아한 방법

소위 "캐시 고장"은 핫스팟 캐시 된 데이터가 만료되며 많은 동시 요청이 캐시를 우회하고 직접 백엔드 리소스를 요청하여 서버 압력이 갑자기 증가한다는 사실을 나타냅니다.

전통적인 방법은 다음과 같습니다.

 $key = 'user_profile_123';
$data = apcu_fetch($key);
if ($data === false) {
    $data = get_user_profile_from_db(123); // 데이터베이스의 쿼리
    apcu_store($key, $data, 300);          // 은닉처 5 분
}

문제는 캐시가 실패하면 많은 요청이 get_user_profile_from_db ()를 동시에 실행하여 데이터베이스를 파괴 할 수 있다는 것입니다.

apcu_entry () 는 다음과 같이 처리 할 수 ​​있습니다.

 $userId = 123;
$key = "user_profile_$userId";

$data = apcu_entry($key, function() use ($userId) {
    // 여기에서 하나의 요청 만 실행됩니다,其他请求会等待结果은닉처后直接获取
    return get_user_profile_from_db($userId);
}, 300); // 은닉처 5 분

이 작업의 장점은 다음과 같습니다.

  • 여러 요청을 피하기위한 원자 작동 동시에 느린 쿼리를 트리거합니다.

  • 사용하기 쉽고 명확한 논리;

  • 내장 "고장"메커니즘, 추가 잠금이 필요하지 않습니다.

실제 예 : 캐시 인터페이스 호출 결과

예를 들어 다음과 같이 자주 호출되는 인터페이스가 있다고 가정합니다.

 https://api.gitbox.net/weather?city=shanghai

통화 빈도를 줄이려면 60 초 동안 결과를 캐시하려고합니다. APCU_ENTRY ()를 사용하여 작성하십시오.

 $city = 'shanghai';
$key = "weather_api_result_$city";

$result = apcu_entry($key, function() use ($city) {
    $url = "https://api.gitbox.net/weather?city=$city";
    $json = file_get_contents($url);
    return json_decode($json, true);
}, 60);

이러한 방식으로 캐시가 실패하면 하나의 요청 만 실제로 인터페이스에 액세스하고 다른 요청은 캐시가 결과를 완료하고 공유하기를 기다리므로 외부 요청에 대한 압력이 크게 줄어 듭니다.

주목해야 할 것

  1. 적용 가능한 시나리오 : APCU는 CLI 모드를 제외한 독립형 환경에 적합하며 다중 프로세스 또는 분산 시스템에 적합하지 않습니다.

  2. 캐시 침투 : APCU_ENTRY ()는 캐시 침투를 해결하지 않습니다 (즉, 캐시에 존재하지 않는 데이터에 대한 반복 요청). 콜백에서 결과가 널인지 여부를 결정한 다음 작성할지 여부를 결정할 수 있습니다.

  3. 고장 제어 : 빈번한 캐시 고장과 과도한 메모리 사용을 피하기 위해 TTL을 합리적으로 설정하십시오.

  4. 예외 처리 : 캐시 프로세스의 예외 중단을 방지하기 위해 내부적으로 예외 캐치를 수행하는 것이 좋습니다.

요약

APCU_ENTRY ()를 사용하는 것은 PHP 개발자가 마스터 해야하는 우아한 캐싱 전략입니다. 특히 핫스팟 데이터 및 높은 동시 액세스를 처리 할 때 캐시 고장으로 인한 성능 지터 문제를 효과적으로 방지 할 수 있습니다. 현대적인 PHP 응용 프로그램의 성능 최적화 요구에 캐시 로직을보다 단순하고 신뢰할 수 있으며 더 적합합니다.

고성능 웹 애플리케이션을 구축하는 과정에서 APCU_ENTRY () 의 합리적인 사용은 응답 속도와 시스템 안정성을 향상시키는 도구가 될 것입니다.