LEVEL 58 QUEST
성능 최적화 & 캐싱
PHP OpCache, 쿼리 최적화, 파일 기반 캐시, HTTP 캐싱, 정적 파일 최적화, 느린 쿼리 분석까지 성능을 극대화합니다.
PHP OpCache 설정
OpCache로 PHP 성능 2~5배 향상
PHP는 매 요청마다 스크립트를 파싱하고 컴파일합니다. OpCache는 컴파일된 바이트코드를 메모리에 캐싱하여 이 과정을 건너뜁니다. 설정만으로 응답 속도가 2~5배 빨라집니다.
; php.ini - OpCache 최적 설정
opcache.enable=1
opcache.memory_consumption=256 ; 캐시 메모리 (MB)
opcache.interned_strings_buffer=16 ; 문자열 버퍼 (MB)
opcache.max_accelerated_files=10000 ; 최대 캐싱 파일 수
opcache.revalidate_freq=60 ; 파일 변경 체크 주기 (초)
opcache.validate_timestamps=1 ; 운영: 0 (수동 리셋), 개발: 1
opcache.save_comments=1 ; PHPDoc 주석 보존
opcache.enable_file_override=1 ; file_exists 등 캐싱
// OpCache 상태 확인 API
function getOpcacheStatus(): array {
$status = opcache_get_status(false);
return [
'enabled' => $status['opcache_enabled'],
'memory_used_mb' => round($status['memory_usage']['used_memory'] / 1048576, 1),
'memory_free_mb' => round($status['memory_usage']['free_memory'] / 1048576, 1),
'hit_rate' => round($status['opcache_statistics']['opcache_hit_rate'], 1) . '%',
'cached_scripts' => $status['opcache_statistics']['num_cached_scripts'],
'cache_full' => $status['cache_full'],
];
}
// 배포 후 캐시 리셋
function resetOpcache(): bool {
return opcache_reset();
}
OpCache 적용 전후 응답 시간 비교
쿼리 최적화 (EXPLAIN, 인덱스 튜닝)
EXPLAIN으로 쿼리 실행 계획 분석
느린 쿼리의 원인은 대부분 인덱스 미사용입니다. EXPLAIN 명령으로 쿼리 실행 계획을 분석하고, 적절한 인덱스를 추가하여 수백 배 빠르게 만들 수 있습니다.
-- 느린 쿼리 예시 (인덱스 없음)
EXPLAIN SELECT * FROM payments
WHERE user_id = 42
AND status = 'completed'
AND created_at >= '2026-01-01'
ORDER BY created_at DESC;
-- 결과: type=ALL, rows=500000 (풀 테이블 스캔!)
-- 복합 인덱스 추가
ALTER TABLE payments
ADD INDEX idx_user_status_date (user_id, status, created_at);
-- EXPLAIN 다시 실행
-- 결과: type=range, rows=15 (인덱스 사용!)
// QueryAnalyzer.php - 느린 쿼리 자동 감지
class QueryAnalyzer {
private $pdo;
private $logger;
private $slowThreshold = 1.0; // 1초 이상은 느린 쿼리
public function query($sql, $params = []): array {
$start = microtime(true);
$stmt = $this->pdo->prepare($sql);
$stmt->execute($params);
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
$elapsed = microtime(true) - $start;
// 느린 쿼리 감지 및 로깅
if ($elapsed > $this->slowThreshold) {
$this->logger->warning("느린 쿼리 감지: {$elapsed}초", 'db', [
'sql' => $sql,
'params' => $params,
'time' => round($elapsed, 3),
'explain' => $this->getExplain($sql, $params),
]);
}
return $result;
}
private function getExplain($sql, $params): array {
$stmt = $this->pdo->prepare("EXPLAIN $sql");
$stmt->execute($params);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
}
| EXPLAIN type | 의미 | 성능 | 대응 |
|---|---|---|---|
| ALL | 풀 테이블 스캔 | 최악 | 인덱스 추가 필수 |
| index | 풀 인덱스 스캔 | 나쁨 | WHERE 조건 확인 |
| range | 인덱스 범위 스캔 | 양호 | 대부분 OK |
| ref | 인덱스 참조 | 좋음 | 최적 |
| const | 기본키/유니크 조회 | 최고 | 완벽 |
🔒
여기까지는 미리보기입니다
성능 최적화 & 캐싱
무료 가입하면 이어서 볼 수 있고, 강의를 완료할 때마다 XP와 레벨이 쌓입니다.
Google로 3초 만에 시작 →🧵 Threads로 시작무료 공개 강의 둘러보기 (Lv.1~3)무료 가입하면 이어서 볼 수 있고, 강의를 완료할 때마다 XP와 레벨이 쌓입니다.