개발 지식

개발 지식

PHP PHP에서 캐시 전략 세분화 하기 (Opcode, DB, 파일 등)

페이지 정보

profile_image
영삼이
0건 181회 25-03-28 23:20

본문

✅ PHP에서 캐시 전략 세분화 하기 (Opcode, DB, 파일 등)

웹 애플리케이션의 속도를 극대화하려면 효율적인 캐싱 전략이 필수입니다. PHP에서는 여러 계층에서 캐시를 적용할 수 있으며, 각각의 목적과 특징이 다릅니다. 이 글에서는 Opcode 캐시부터 데이터, 파일, HTTP 캐시까지 다양한 캐시 전략을 구체적으로 정리합니다.


🔧 1. Opcode 캐시 (OPcache)

PHP는 실행 시마다 코드를 파싱하고 컴파일합니다. OPcache는 이 과정을 캐시하여 속도를 획기적으로 높여줍니다.

[code]
opcache.enable=1
opcache.memory_consumption=128
opcache.max_accelerated_files=10000
opcache.validate_timestamps=0 ; 프로덕션 환경
[/code]
- 속도 향상 가장 강력함
- 코드 변경 후 `validate_timestamps=1` 또는 수동 무효화 필요

---

### 🗃 2. **데이터 캐시 (in-memory: Redis, APCu)**

자주 사용하는 데이터(예: 설정값, 카운터, 세션 등)를 메모리에 캐시

```php
[code=php]
// APCu 예제
apcu_store('site_name', '영삼넷', 300);
echo apcu_fetch('site_name');

// Redis 예제
$redis->setex('top_articles', 600, json_encode($articles));
[/code]
  • 속도: 메모리 → 매우 빠름

  • 데이터 변경이 잦지 않은 경우에 적합

  • Redis는 여러 서버 간 공유도 가능


📁 3. 파일 캐시

DB 결과나 API 응답을 파일로 저장해두고 재사용

[code=php]
$key = 'article_123';
$cacheFile = __DIR__ . "/cache/{$key}.json";

if (file_exists($cacheFile) && time() - filemtime($cacheFile) < 600) {
    $data = json_decode(file_get_contents($cacheFile), true);
} else {
    $data = fetchFromDatabase(123);
    file_put_contents($cacheFile, json_encode($data));
}
[/code]
  • 파일 시스템만으로 구현 가능 → 간단

  • 단점: 파일 수 많아지면 I/O 병목 주의


💾 4. 쿼리 캐시

쿼리 결과 자체를 캐싱하여 DB 부하 감소

[code=php]
// key는 쿼리와 파라미터 조합으로 생성
$key = md5("SELECT * FROM posts WHERE id=5");

if ($cache->has($key)) {
    $post = $cache->get($key);
} else {
    $post = $db->query(...);
    $cache->set($key, $post, 300);
}
[/code]
  • 읽기 많은 데이터에서 효과 큼

  • 결과 일관성을 보장하려면 무효화 전략 필요


🌐 5. HTTP 캐시 (브라우저/Reverse Proxy)

클라이언트 또는 프록시 서버에서 응답 캐싱 → 트래픽 및 서버 로드 감소

[code=php]
header('Cache-Control: public, max-age=3600');
header('ETag: "abc123"');
[/code]
- CDN, Nginx, Cloudflare 등과 조합하면 매우 효과적
- API 응답에도 적용 가능

---

### 🧠 캐시 레이어 요약

| 레이어 | 위치 | 예시 | 특징 |
|--------|------|------|------|
| OPcache | PHP 엔진 | 바이트코드 | 무조건 사용 |
| 데이터 캐시 | 메모리 | Redis, APCu | 빠름, 공유 가능 |
| 파일 캐시 | 파일시스템 | JSON 파일 | 간단하지만 I/O 유의 |
| 쿼리 캐시 | 애플리케이션 | DB 결과 | 반복 쿼리에 효과 |
| HTTP 캐시 | 클라이언트/Proxy | Cache-Control | 트래픽 분산 |

---

### ✅ 정리 체크리스트

- [ ] OPcache 활성화했는가?
- [ ] 반복 조회 데이터는 Redis/APCu에 캐시했는가?
- [ ] 무거운 연산 결과는 파일로 저장했는가?
- [ ] 쿼리 결과에 캐시 키를 구성했는가?
- [ ] 프론트엔드에 Cache-Control 헤더를 적절히 설정했는가?

---

### 🧠 요약

- 캐시는 하나만 쓰는 게 아니라 **복합적으로 계층화**하는 것이 핵심
- 캐시 대상 선정 → 저장소 선택 → 무효화 전략까지 설계되어야 함
- 잘 설계된 캐시 시스템은 성능, 안정성, 확장성 모두 향상시킴

---

댓글목록

등록된 댓글이 없습니다.