데브포일 홈
DEV MODE - 실서버 영향 없음 📦 배포 관리
성능 최적화 & 캐싱
+250 XP
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 적용 전후 응답 시간 비교

OpCache OFF
120ms
OpCache ON
35ms
OpCache + 파일캐시
15ms

쿼리 최적화 (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)