동시 웹 애플리케이션에서 자주 데이터 읽기 및 쓰기는 성능 병목 현상이됩니다. 데이터베이스에 대한 압력을 완화하고 데이터 액세스 속도를 높이기 위해 개발자는 종종 캐싱 메커니즘을 중간 계층으로 사용합니다. APCU 는 PHP에서 특히 인기있는 경량 메모리 캐싱 솔루션입니다. APCU 가 제공하는 많은 인터페이스 중에서 APCU_ENTRY 기능은 원자력과 편의성을 갖춘 효율적인 데이터 캐싱 전략을 구축하기위한 강력한 도구가되었습니다.
이 기사는 APCU_ENTRY 기능을 사용하는 방법을 소개하고 영구 스토리지 (예 : 데이터베이스 또는 파일 시스템)를 결합하여 효율적이고 신뢰할 수있는 데이터 액세스 솔루션을 달성합니다.
APCU_ENTRY 는 PHP 5.5+에 도입 된 편리한 기능으로 캐시 값을 얻는 동안 캐시를 "백필"하기 위해 콜백 함수를 정의 할 수 있습니다. 캐시에 해당 키가 없으면 콜백 함수를 자동으로 호출하여 데이터를 생성하고 캐시에 씁니다.
함수 서명은 다음과 같습니다.
mixed apcu_entry(string $key, callable $generator, int $ttl = 0)
$ 키 : 캐시 된 키 이름.
$ 생성기 : 데이터를 생성하는 데 사용되는 콜백 함수.
$ ttl : 캐시 생존 시간 (초), 기본값은 만료되지 않습니다.
기존 캐시 사용 방법은 "캐시를 먼저 확인한 다음 데이터베이스를 확인하십시오"입니다. 프로세스는 다음과 같습니다.
캐시가 발생하는지 여부를 쿼리하십시오.
누르면 직접 돌아갑니다.
누락 된 경우 데이터베이스에서 데이터를 읽으십시오.
캐시에 데이터를 작성하고 반환하십시오.
apcu_entry를 사용하면 위의 논리를 한 줄로 압축 할 수 있습니다.
$data = apcu_entry('user_42', function() {
return fetch_user_from_db(42);
}, 300);
위의 코드의 의미는 다음과 같습니다. 캐시에서 user_42를 읽으십시오. 그렇지 않은 경우 fetch_user_from_db (42)를 실행하여 데이터를 가져 와서 300 초 동안 캐시합니다.
사용자 정보 테이블이 있고 이제 사용자 데이터를 캐시하고 싶다고 가정합니다.
function fetch_user_from_db($id) {
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'root', '');
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?");
$stmt->execute([$id]);
return $stmt->fetch(PDO::FETCH_ASSOC);
}
function get_user($id) {
return apcu_entry("user_$id", function() use ($id) {
return fetch_user_from_db($id);
}, 600); // 은닉처 10 분
}
이 모드에는 간결한 코드가있을뿐만 아니라 캐시 고장 문제를 효과적으로 피합니다.
일부 데이터는 외부 API에서 제공되며 통화 비용이 높습니다. 예를 들어 https://api.gitbox.net/user/42 에서 사용자 정보를 가져옵니다. APCU_ENTRY를 캐시로 사용할 수도 있습니다.
function fetch_user_from_api($id) {
$url = "https://api.gitbox.net/user/$id";
$response = file_get_contents($url);
return json_decode($response, true);
}
function get_user_from_api($id) {
return apcu_entry("api_user_$id", function() use ($id) {
return fetch_user_from_api($id);
}, 300); // 은닉처 5 분
}
이렇게하면 원격 API를 호출하는 빈도를 크게 줄이고 응답 속도를 향상시킬 수 있습니다.
공유 메모리 한계 : APCU의 캐시 된 데이터는 로컬 메모리에 저장되며 다른 PHP-FPM 프로세스간에 공유되므로 APC.SHM_SIZE가 충분한 지 확인하십시오.
원본에만 적용 가능 : APCU는 프로세스 내 캐시이며 다중 서버 환경에 대한 것이 아닙니다. Redis, Memcached 등과 같은 분산 캐시와 함께 사용할 수 있습니다.
더 읽기 및 덜 읽는 데이터에 적합 : 자주 업데이트되는 데이터에는 APCU 캐시가 권장되지 않으며 데이터 불일치를 방지하기 위해 동기화 메커니즘을 사용해야합니다.
APCU_ENTRY를 사용하면 캐시를 데이터베이스 또는 API와 같은 지속적인 스토리지와 우아하게 결합하여 간결하고 효율적이며 결함이 강한 코드를 작성할 수 있습니다. 그것의 원자력과 게으른 하중 특성은 개발 프로세스를 단순화 할뿐만 아니라 시스템의 유지 보수 가능성을 향상시킵니다.
데이터베이스 쿼리 결과에 로컬로 캐시 되든 원격 API에 대한 액세스 빈도를 줄이든 APCU_ENTRY 는 권장되는 실용적인 솔루션입니다. 성능 최적화를 추구하는 PHP 프로젝트의 필수 부분입니다.