PHP에서 데이터를 파일로 캐싱(Caching)하기


웹 애플리케이션의 성능 향상과 DB 과부하 방지를 위한 가장 가성비 높은 해법인 PHP 기반 파일 캐싱(File Caching) 구현 가이드입니다.

별도의 캐시 서버(Redis, Memcached) 구축 없이 PHP 내장 파일시스템 함수와 직렬화(serialize) 기술을 활용하여 간단하고 효율적으로 데이터 캐시를 구현하는 전략을 소개합니다.

 

1. 핵심 아이디어: PHP 소스코드를 담은 파일 생성

PHP로 실행 가능한 PHP 소스 파일 자체를 생성하고, 이를 필요할 때 include로 불러와 실행하는 방식입니다.

$filename = 'print.php';

$fp = fopen($filename, 'w+');
fwrite($fp, '<?php echo \'PRINT\'; ?>');
fclose($fp);

include($filename);

2. 변수 직렬화(Serialize)를 활용한 일반화된 캐싱 함수

배열, 객체, 문자열, 숫자 등 다양한 자료형을 손실 없이 캐싱하기 위해 serialize()와 unserialize()를 조합하여 캐시 파일 생성 함수를 정의합니다.

function setCacheFile($fileName, $valName, $target)
{
    // 데이터 직렬화 및 따옴표 이스케이프 처리
    $target = str_replace('"', '\"', serialize($target));
    
    // 캐시 파일 생성
    $fp = fopen($fileName, 'w+');
    fwrite($fp, '<?php ');
    fwrite($fp, '$' . $valName . ' = unserialize("' . $target . '");');
    fwrite($fp, ' ?>');
    fclose($fp);
}

// 예제 사용법
$fileName = 'dataCache.php';
$arr = array('서울', 2.62, null, false, array(1, 3));

setCacheFile($fileName, 'dat', $arr);

// 캐시 불러오기
include($fileName);
var_dump($dat);

3. TTL(Time To Live)이 적용된 자동 캐시 갱신 함수

스케줄러(Crontab) 관리 부담을 줄이기 위해, 사용자 요청 시 파일의 수정 시간(filemtime())을 확인하여 지정한 유효 시간(TTL)이 지나면 자동으로 데이터를 재갱신하도록 구현합니다.

function getCacheData($fileName, $valName, $ttl = 600)
{
    // 캐시 파일이 없거나 TTL(유효시간)이 경과한 경우 재생성
    if(!file_exists($fileName) || filemtime($fileName) + $ttl < time())
    {
        // 1. DB 조회 또는 무거운 로직 수행 (예시)
        $arr = array();
        $res = mysqli_query($db, 'SELECT * FROM board ORDER BY no DESC LIMIT 5');
        while($v = mysqli_fetch_assoc($res)) {
            $arr[] = $v;
        }

        // 2. 캐시 파일 갱신
        setCacheFile($fileName, $valName, $arr);

        return $arr;
    }
    else
    {
        // 유효한 캐시 파일 불러오기
        include($fileName);
        return $$valName;
    }
}

// 10분(600초) TTL 적용 예시
$dat = getCacheData('dataCache.php', 'dat', 600);
var_dump($dat);

실무 적용 시 주의사항

- 동시성 문제: 동시 방문자가 많은 사이트에서 캐시 만료 시점에 여러 요청이 한 번에 캐시 갱신 로직을 수행하지 않도록 파일 락(flock)이나 예외 처리를 고려해야 합니다.

- 보안: 캐시 파일에 민감한 정보(개인정보, DB 접속 정보 등)가 포함될 경우 Web에서 direct 접근이 불가능한 상위 디렉터리에 저장하는 것이 좋습니다.