APCU_ENTRY는 값을 캐시에 저장하는 데 사용되는 APCU Extension에서 제공하는 기능입니다. APCU_STORE 와 달리 APCU_ENTRY는 먼저 캐시에 키가 이미 존재하는지 확인합니다. 존재하면 캐시의 값을 반환합니다. 존재하지 않으면 주어진 콜백 함수를 실행하고 콜백 함수의 리턴 값을 캐시합니다. 이 기능을 사용하면 게으른 부하 데이터가 필요할 때 매우 유용합니다.
$value = apcu_entry('my_key', function () {
return someExpensiveFunction();
});
위의 코드에서 My_Key가 이미 캐시에있는 경우 APCU_ENTRY는 캐시 된 값을 직접 반환합니다. 그렇지 않으면 일부 소수의 기능이 실행되고 결과가 캐시됩니다.
APCU_ENTRY는 캐싱 데이터의 편의성을 제공하지만 부적절한 사용은 일부 문제, 특히 메모리 오버플로를 유발할 수 있습니다. 몇 가지 일반적인 이유는 다음과 같습니다.
콜백 함수가 매우 많은 양의 데이터를 반환하면 캐시 된 컨텐츠도 매우 커져 메모리 오버플로가 발생할 수 있습니다. 이 문제를 피하기 위해 캐시의 크기를 제한하거나 데이터를 최적화하여 콜백 기능이 너무 큰 데이터 구조를 생성하지 않도록 할 수 있습니다.
예를 들어, 콜백 함수가 많은 데이터베이스 쿼리 결과 또는 큰 개체를 반환한다고 가정합니다.
$value = apcu_entry('large_data', function () {
return fetchLargeDataFromDatabase(); // 이 데이터는 매우 클 수 있습니다
});
해결책은 너무 큰 데이터를 캐시에 직접 저장하지 않거나 데이터를 분할하여 캐시 된 데이터의 양이 매번 보통인지 확인하는 것입니다.
APCU는 캐시 된 데이터의 만료 시간을 설정할 수 있지만 만료 시간을 설정하지 않았거나 캐시 된 데이터가 존재하고 정리되지 않은 경우 메모리 사용이 계속 증가하여 메모리 오버 플로우를 초래할 수 있습니다. 이 문제를 피하려면 항상 캐시의 만료 시간을 설정하고 더 이상 필요하지 않은 데이터를 정기적으로 정리해야합니다.
apcu_entry('my_key', function () {
return fetchData();
}, 3600); // 설정1시간이 만료되었습니다
캐시 된 데이터가 더 이상 필요하지 않은 경우 APCU_DELETE 로 정기적으로 청소하십시오.
apcu_delete('my_key');
동시성 환경에서 여러 요청이 동시에 동일한 콜백 기능을 호출하여 매번 캐시에 데이터를 저장하려고 시도 할 수 있습니다. 이 경우 캐시 관리가 부적절한 경우 여러 데이터 사본이 반복적으로 저장되어 메모리를 낭비 할 수 있습니다. 이 문제를 피하기 위해 파일 잠금 또는 메모리 잠금과 같은 잠금 메커니즘을 사용하여 하나의 요청 만 콜백을 실행하고 한 번에 데이터를 저장할 수 있는지 확인할 수 있습니다.
$value = apcu_entry('my_key', function () {
// 동시 실행을 피하기 위해 잠금 장치를 사용하십시오
if (apcu_exists('my_key_lock')) {
return null; // 캐시가 업데이트되는 경우,빈 값을 반환하십시오
}
apcu_store('my_key_lock', true); // 설정锁
$data = fetchData();
apcu_store('my_key', $data);
apcu_delete('my_key_lock'); // 잠금을 삭제하십시오
return $data;
});
복잡한 개체 또는 자원을 저장할 때는 직렬화 할 수 있는지 확인하십시오. 캐시에 직렬화 할 수없는 객체를 저장하려고하면 PHP는 오류가 발생하여 애플리케이션이 충돌 또는 메모리 문제를 일으킨다. 이를 피하기 위해 직렬화 및 비 제외 화는 항상 복잡한 데이터를 저장하는 데 사용해야합니다.
$value = apcu_entry('complex_object', function () {
return serialize(new MyComplexObject());
});
캐시를 가져 오면 비 속도를 사용하여 물체를 복원하십시오.
$object = unserialize(apcu_fetch('complex_object'));
APCU_ENTRY를 사용할 때 메모리 오버 플로우를 효과적으로 피하기 위해 다음과 같은 조치를 취할 수 있습니다.
캐시 된 데이터의 크기 제한 : 캐시 된 데이터 구조를 너무 크게 피하십시오. 페이징, 청크 스토리지 등을 통해 매번 캐시 된 데이터 양을 제어 할 수 있습니다.
만료 시간 설정 : 캐시가 항상 존재하고 점유 메모리를 피하기 위해 각 캐시 항목에 대해 합리적인 만료 시간을 설정하십시오.
정기적으로 캐시를 정리하십시오 : APCU_DELETE를 사용하여 더 이상 쓸모없는 캐시가 메모리 소비되는 것을 방지 할 필요가없는 캐시 된 데이터를 삭제하십시오.
비 서리 화 된 물체 저장을 피하십시오 : 복잡한 개체의 경우 직렬화되고 제대로 변형 될 수 있는지 확인하십시오.
메모리 잠금 사용 : 높은 동시성 환경에서 잠금 메커니즘을 사용하여 콜백 기능을 동시에 실행하는 다중 동시 요청을 피합니다.