몇일 동안 discuz의 캐시를 만지작거려서 단서를 얻었습니다. 효율이 정말 낮습니다. 2333333~~~~
discuz는 다양한 캐시를 사용할 수 있지만 여기서는 데이터 캐시에 대해서만 이야기합니다. discuz는 redis 및 memcache와 같은 캐싱 방법을 지원합니다. /config/config_global.php에서 설정하기만 하면 환경에서 이를 지원합니다.
사실 캐시를 읽고 쓰는 것은 비교적 간단합니다.
require_once libfile('function/cache'); //加载缓存类 savecache($cachename, $data); //写缓存 loadcache('plugin_fahao_kflist'); //读缓存,将缓存写到$_G变量中,通过读取$_G['cache']来获取缓存数据。
여기서 savecache( )는 캐시 설정(예: memcacheredisxpc 등)에 데이터를 쓰고 캐시는 common_syscache 테이블에 기록됩니다.
loadcache()를 사용하면 table_common_syscache 클래스의 fetch_all 메서드가 호출되어 캐시를 얻습니다. 1. 먼저 메모리 캐시가 설정되어 있는지 확인합니다. 캐시 데이터가 존재하지 않고 메모리 캐시가 설정되지 않은 경우 데이터가 직접 반환됩니다. 2. 그런 다음 파일 캐시가 설정되어 있는지 확인합니다. 그렇다면 파일 캐시 데이터를 읽고 데이터가 존재하지 않거나 파일 캐시가 설정되지 않은 경우 3단계로 이동합니다. 3. common_syscache 테이블에서 데이터를 읽고 반환합니다. (그래서 캐시를 지울 때 이러한 측면을 고려해야합니다)
핵심은 전역->성능 최적화->메모리 최적화에서 할 수 있습니다. 일부 설정 최적화 메모리 캐시 관리에서는 지정된 캐시를 직접 지울 수도 있습니다. 하지만 맞춤형 캐시의 경우 캐시를 삭제하는 자체 기능을 개발해야 합니다. 제 환경에서는 Memcache 캐시가 켜져 있고 시스템에 내장된 memory() 함수를 사용하여 캐시를 삭제했는데, loadcache()를 사용하여 데이터를 읽어보니 캐시가 여전히 존재하는 것을 발견했습니다. 그 이유는 memory()가 Memcache 데이터를 지울 수 있지만 commom_syscache 테이블은 지울 수 없기 때문에 loadcache()를 사용할 때 여전히 존재하기 때문입니다. 나중에 deletegroupcache() 함수를 확인해서 찾았습니다. 전체적인 상황에 적응하기 위해 간단히 /source/function/function_core.php에 deletecache() 함수를 작성했습니다. 코드는 다음과 같습니다.
function deletecache($cachenames) { if(!empty($cachenames)) { C::t('common_syscache')->delete($cachenames); } }
위 내용은 내용의 측면을 포함하여 discuz의 데이터 캐싱 사용을 소개합니다. PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.