현재 위치: > 최신 기사 목록> APCU_ENTRY를 사용하여 멀티 프로세스 프로그램과 캐시를 공유하는 방법

APCU_ENTRY를 사용하여 멀티 프로세스 프로그램과 캐시를 공유하는 방법

gitbox 2025-05-26

PHP 개발 관행에서 APCU 확장은 종종 요청간에 데이터를 공유하는 데 사용됩니다. 그러나 PHP의 공유 메모리 메커니즘은 실행중인 모델 (특히 FPM 또는 Apache의 다중 프로세스 모드)에 의해 제한되기 때문에 개발자는 종종 "다중 프로세스 공유 캐시"를 오해합니다. 이 기사는 APCU_ENTRY 기능을 통해 일반적인 다중 프로세스 프로그램에서 APCU 캐시의 공유 사용을 구현하는 방법을 살펴 봅니다.

1. APCU의 작용 메커니즘을 이해하십시오

APCU (대체 PHP 캐시 사용자)는 공유 메모리를 기반으로 데이터 캐싱을 구현하는 PHP의 사용자 캐시 모듈입니다. CLI 모드 및 웹 모드에 적합하지만 한 가지 제한 사항이 있습니다. 다중 프로세스 모델에서는 가변 공간이 각 PHP 프로세스간에 공유되지 않으며 APCU 공유는 메모리 매핑에 따라 다릅니다 .

즉, PHP가 동일한 APCU 메모리 영역을 사용하는 한 모든 프로세스는이 공유 메모리에서 캐시 된 데이터에 액세스 할 수 있음을 의미합니다. 가변 범위는 격리되어 있지만 캐시는 아닙니다.

2. apcu_entry 함수 소개

APCU_ENTRY 는 캐시 항목을 얻거나 생성하기 위해 PHP 5.5+에 도입 된 기능입니다. 일반적인 사용법은 다음과 같습니다.

 $value = apcu_entry('cache_key', function() {
    return some_expensive_function();
});

그 원칙은 다음과 같습니다.

  1. cache_key가 존재하는지 확인하십시오.

  2. 존재하는 경우 직접 돌아갑니다.

  3. 존재하지 않으면 폐쇄에서 함수를 실행하고 결과를 캐시하고 반환하십시오.

이 "게으른 컴퓨팅 + 캐싱"전략은 여러 프로세스의 리소스 공유 요구 사항에 매우 적합합니다.

3. 여러 프로세스에서 응용 프로그램 실습

PHP의 PCNTL_FORK를 예로 들어 보면 캐시가 공유되는지 여부를 확인하기 위해 다중 프로세스 시나리오를 시뮬레이션합니다.

 <?php
if (!extension_loaded('apcu')) {
    die("APCu 확장이 활성화되지 않았습니다\n");
}

apcu_clear_cache();

$pid = pcntl_fork();

if ($pid == -1) {
    die("아동 과정을 만들 수 없습니다\n");
} elseif ($pid === 0) {
    // 하위 프로세스
    $data = apcu_entry('shared_key', function () {
        echo "하위 프로세스:캐시 미스,데이터를 생성합니다\n";
        return '하위 프로세스写入的数据 ' . time();
    });
    echo "하위 프로세스读取缓存:$data\n";
} else {
    // 부모 과정
    sleep(1); // 等待하위 프로세스先执行
    $data = apcu_entry('shared_key', function () {
        echo "부모 과정:캐시 미스,데이터를 생성합니다\n";
        return '부모 과정写入的数据 ' . time();
    });
    echo "부모 과정读取缓存:$data\n";
}

출력 분석

보통 당신은 다음을 볼 수 있습니다.

 하위 프로세스:캐시 미스,데이터를 생성합니다
하위 프로세스读取缓存:하위 프로세스写入的数据 1715600000
부모 과정读取缓存:하위 프로세스写入的数据 1715600000

이것은 APCU의 캐시 된 컨텐츠가 실제로 부모와 아동 프로세스간에 공유되었음을 보여줍니다.

4. 배포 예방 조치

  1. PHP가 동일한 SAPI를 사용하고 있는지 확인하십시오 (예 : CLI 모드에서 여러 자식 프로세스를 실행) .

  2. php.ini에서 apc.enable_cli = 1이 활성화되어 있는지 확인하십시오 . 그렇지 않으면 APCU가 CLI 모드에서 활성화되지 않습니다.

  3. APCU는 다중 서버 캐시 공유에 적합하지 않습니다 (예 :로드 밸런싱 하의 여러 PHP 인스턴스) . 멀티 머신 캐시가 필요한 경우 Redis, Memcached 및 기타 서비스를 사용하십시오.

  4. 캐시 지속성에 대한 과도한 의존성을 피하고 APCU는 프로세스 레벨 캐시이며 PHP-FPM을 다시 시작하면 데이터 손실이 발생합니다.

5. 샘플 응용 프로그램 : 캐시 원격 인터페이스 데이터

원격 API에서 구성 데이터를 얻습니다.

 $config = apcu_entry('remote_config', function () {
    echo "원격 인터페이스에서 데이터를 가져옵니다...\n";
    $json = file_get_contents('https://gitbox.net/api/config');
    return json_decode($json, true);
});

캐시가 만료되지 않은 한, 프로세스 가이 논리를 호출하지 않고 인터페이스를 반복적으로 요청하지 않습니다. 이는 성능을 크게 향상시키고 원격 통화 수를 줄입니다.

6. 요약

APCU_ENTRY는 우아한 캐싱 메커니즘을 제공합니다. 특히 "높은 계산 비용 또는 높은 통화 비용"시나리오에 적합합니다. 다중 프로세스 PHP 프로그램에서 APCU의 캐시 된 컨텐츠는 실행중인 환경에서 허용하는 한 프로세스간에 공유 될 수 있습니다. 운영 원리와 한계를 이해하면 고성능 PHP 응용 프로그램을보다 효율적으로 구축하는 데 도움이됩니다.