본문으로 건너뛰기

Redis를 이용하여 WordPress의 속도를 개선하는 방법을 알려주세요?

💡 요약 정리

  • Redis로 WordPress 페이지 HTML을 캐시하여 응답 속도를 크게 높일 수 있습니다.
  • SSH 접속 후 git으로 predis 라이브러리를 설치합니다.
  • 기존 index.php는 백업하고, 제공된 Redis 연동 예제 코드로 교체합니다.
  • REDIS_HOSTREDIS_PORT는 Redis 호스팅의 연결 도메인과 포트로 바꿔 입력합니다.
  • git 설치 및 PHP 5.3 이상 환경이 필요합니다.
"WordPress 컨텐츠 Cache하는 방법을 알려드릴께요."

Redis를 이용하여 WordPress의 속도를 개선할 수 있으며, 그 방법을 소개해 드립니다.

1. predis 라이브러리 다운로드

  • 서버에 SSH 접속하여 GIT로 predis 라이브러리를 다운로드 합니다.
  • 아래 명령어를 사용하여 predis 라이브러리 다운로드 하면 predis 디렉토리가 생성된 것으로 확인 할 수 있습니다.
git clone http://github.com/nrk/predis.git
  • git이 설치되어 있어야 합니다.

  • predis는 php 5.3 이상 버전만을 지원합니다.

  • 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를 교체하기 전에 반드시 기존 파일을 백업해 두세요.