Redis를 이용하여 WordPress의 속도를 개선하는 방법을 알려주세요?
💡 요약 정리
- Redis로 WordPress 페이지 HTML을 캐시하여 응답 속도를 크게 높일 수 있습니다.
- SSH 접속 후 git으로 predis 라이브러리를 설치합니다.
- 기존 index.php는 백업하고, 제공된 Redis 연동 예제 코드로 교체합니다.
- REDIS_HOST와 REDIS_PORT는 Redis 호스팅의 연결 도메인과 포트로 바꿔 입력합니다.
- git 설치 및 PHP 5.3 이상 환경이 필요합니다.
Redis를 이용하여 WordPress의 속도를 개선할 수 있으며, 그 방법을 소개해 드립니다.
1. predis 라이브러리 다운로드
- 서버에 SSH 접속하여 GIT로 predis 라이브러리를 다운로드 합니다.
- 아래 명령어를 사용하여 predis 라이브러리 다운로드 하면 predis 디렉토리가 생성된 것으로 확인 할 수 있습니다.
git clone http://github.com/nrk/predis.git
-
git이 설치되어 있어야 합니다.
-
predis는 php 5.3 이상 버전만을 지원합니다.
-
SSH 접속을 위해 기능 허용이 필요할 수 있습니다.
- 바로가기 : Shell(SSH) 접속설정
2. Redis가 연동 된 WordPress의 index.php 파일 업로드
- 기존에 사용하던 index.php 파일을 index.php.bak 등으로 백업하신 후, 아래의 내용으로 index.php 파일을 생성하여 업로드 합니다. (FTP: 파일을 서버에 올리고 내려받는 방법/프로그램)
- 본문 중, localhost로 표시된 부분은 Redis 광호스팅의 연결도메인을 입력하시고, 포트 번호는 나의서비스관리에서 확인하여 입력해 주시기 바랍니다.
- 바로가기 : 서비스 접속 정보
<?php
$services_json = json_decode(getenv("VCAP_SERVICES"),true);
$redis_config = $services_json["redis-2.2"][0]["credentials"];
/* 환경설정 */
define('REDIS_DEBUG', false);
define('REDIS_HOST', 'localhost') // Redis 호스팅 연결도메인
define('REDIS_PORT', '23381'); // 포트
define('WP_USE_THEMES', true);
require("./predis/lib/Predis/Autoloader.php");
PredisAutoloader::register();
$redis = new PredisClient(array(
'host' => REDIS_HOST,
'port' => REDIS_PORT,
'name' => REDIS_NAME,
'password' => REDIS_PASSWORD
));
$host = $_SERVER['HTTP_HOST'];
$url = "http://".$host.$_SERVER['REQUEST_URI'];
$key = md5($host);
$field = md5($url);
/* 조건 설정 */
$isModified = (isset($_SERVER['HTTP_CACHE_CONTROL']) && ($_SERVER['HTTP_CACHE_CONTROL'] == 'max-age=0')) ? true : false;
$isLoggedIn = preg_match("/wordpress_logged_in/", var_export($_COOKIE, true));
$isCached = $redis->hexists($key, $field);
if (REDIS_DEBUG) {
$start = microtime();
}
//로그인유무, 컨텐츠가 변경되었는지 여부, 캐시존재유무 Short-Cirtcuit Evalutation에 따라 redis 체크는 마지막에둠
if (!$isLoggedIn && !$isModified && $isCached) {
echo $redis->hget($key, $field);
}
// 컨텐츠가 변경되었다면, 댓글 남기기 등
else if ($isModified) {
require('./wp-blog-header.php');
$redis->hdel($key, $field);
}
// 로그인 되어 있을 경우, 캐시 하지 않음
else if ($isLoggedIn) {
require('./wp-blog-header.php');
}
else {
ob_start();
require('./wp-blog-header.php');
$html = ob_get_contents();
ob_end_clean();
echo $html;
$redis->hset($key, $field, $html);
}
if (REDIS_DEBUG) {
$end = microtime();
if (!$isLoggedIn && !$isModified && $isCached) {
echo '캐시된 문서';
}
else if($isModified) {
echo '캐시 삭제 후 DB에서 데이터 로드';
}
else if ($isLoggedIn) {
echo 'DB에서 데이터 로드';
}
else {
echo 'DB에서 데이터로드 후 캐시저장';
}
echo '페이지 생성시간: '.getExecutionTime($start, $end).'초';
}
function getExecutionTime($start, $end) {
$time = (getMillisecond($end) - getMillisecond($start));
return round($time,5);
}
function getMillisecond($time) {
list($usec, $sec) = explode(" ",$time);
return ((float)$usec + (float)$sec);
}
?>
중요: index.php를 교체하기 전에 반드시 기존 파일을 백업해 두세요.