Memcached를 이용한 php - 설치와 예제
Memcached 의 활용
웹서버 같은 트래픽이 많은 서비스에서 memcache를 사용하면 DB부하나 불필요한 I/O를 줄일수 있습니다.
예를 들어 홈페이지 메인의 HTML에 노출되는 Data를 웹캐싱으로 처리하면 대량의 트레픽이 발생 하더라도 DB의 부하를 주지 않을 수 있습니다.
특정 Interval간 변하지 않는 데이터를 memcache에 캐싱하면 DB를 읽지 않아 부하를 경감할 수 있습니다.
주로 Data를 DB에 넣지 않고 사용자 끼리 통신을 하는 채팅이나 메시지서비스 등에 활용하면 효과적입니다.
Memcached 설치
1. install_memcached.sh 를 아래 내용으로 만들어 Root 계정으로 실행
VER="1.4.15"
arc_name="memcached-$VER.tar.gz"
if [ ! -f "$arc_name" ]
then
wget http://memcached.googlecode.com/files/memcached-$VER.tar.gz -O $arc_name
fi
yum install -y "libevent*"
tar xvzf "$arc_name"
cd "memcached-$VER"
OPTIONS=" --with-libevent=/usr "
./configure $OPTIONS && make && sudo make install
cp -p scripts/memcached.sysv /etc/rc.d/init.d/memcached
chmod 755 /etc/rc.d/init.d/memcached
ls -al /etc/rc.d/init.d/memcached
/etc/rc.d/init.d/memcached stop
2. memcached 서비스 실행 파일 수정
memcached 실행을 위해서 "/etc/rc.d/init.d/memcached" 파일을 수정합니다. # by cdr
다음과 같이 memcached 서비스 파일을 수정하여 memcached를 시작하고 종료 할수 있도록 설정합니다.
#> /etc/rc.d/init.d/memcached start
#> /etc/rc.d/init.d/memcached stop
start () {
echo -n $"Starting $prog: "
ls /var/run/memcached 2>/dev/null || mkdir -p /var/run/memcached
chown $USER /var/run/memcached
daemon $memcached -d -p $PORT -u $USER -m $CACHESIZE -c $MAXCONN -P /var/run/memcached/memcached.pid $OPTIONS
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/memcached
}
3. [예시] Memcached를 이용한 PHP 소스
[php 샘플]
<?
function memcached_handle($DEBUG=0){
$memcache = new Memcache;
$memcache->connect('localhost', 11211) or die ("Could not connect");
$version = $memcache->getVersion();
if($version != '' ){
debug("memcached_handle", "version:$version", $DEBUG);
return $memcache;
}else{
return '';
}
}
function memcached_set($memcache, $m_key="key", $m_msg="test", $ttl=20, $DEBUG=0){
$memcache->set($m_key, $m_msg, MEMCACHE_COMPRESSED, 10) or die ("Failed to save data at the server");
$get_result = $memcache->get($m_key);
debug(" > memcached_set::","Store data in the cache (data will expire in 10 seconds)", $DEBUG);
debug(" > func->memcached_set", " Make m_key : $m_key time:[$ttl] sec------>", $DEBUG);
return $get_result;
}
function memcached_get($memcache, $m_key="key", $DEBUG=0){
$get_result = $memcache->get($m_key);
debug(" > func->memcached_get", " Get Cache [$m_key] ", $DEBUG);
return $get_result;
};
function memcached_getSet($memcache, $m_key="key", $m_msg="test", $ttl=20, $DEBUG=0){
$msg_get = memcached_get($memcached, $service_key, $DEBUG);
$mem_set = memcached_set($memcache, $m_key, $m_msg, $ttl, $DEBUG);
$get_result = memcached_get($memcached, $service_key, $DEBUG);
debug("memcached_getSet->memcached_get", "[#1]=====================", $DEBUG);
debug("memcached_getSet->memcached_set", "[#2]====================", $DEBUG);
debug( ">> memcached_getSet :",$get_result, $DEBUG);
return $get_result;
}
function get_service_data($service_name="http_result", $DEBUG=0){
$service_url ="http://localhost/grid_exe/_lib/load_{$service_name}.php";
$service_msg = file_get_contents($service_url);
return $service_msg;
}
function memcached_Cache( $service_name="http_result", $service_ttl=30, $DEBUG=0){
$service_key = "key_".$service_name;
$memcached = memcached_handle( $DEBUG);
$msg_get = memcached_get($memcached, $service_key, $DEBUG);
debug("memcached_Cache-> memcached_handle::","[# memcached.connect]", $DEBUG);
debug(" > memcached_handle::", $memcached, $DEBUG);
debug(" > memcached_get ","[# $service_key.key] ", $DEBUG);
debug(" > memcached_get", $mem_get, $DEBUG);
if( ! $msg_get ){
debug("memcached_Cache :::[ MAKE NEW CACHE ]===================>> ", $DEBUG);
$service_msg = get_service_data($service_name);
$mem_set = memcached_set($memcached, $service_key, $service_msg, $service_ttl, $DEBUG);
debug(" ++ get_service_data XML ","[# $service_name : service_name]===", $DEBUG);
debug(" >>>> memcached_set ","[# $service_key:service_key]=========", $DEBUG);
return $service_msg;
}else{
return $msg_get;
}
}
?>
.
댓글
댓글 쓰기