Source for file memcached.php
Documentation is available at memcached.php
* sThread MEMCACHED module
* memcached에 stat 명령을 전송하여 결과값을 확인한다.
* <li>첫라인이 <i>STAT pid</i>로 시작하는지 확인</li>
* <li>마지막 라인이 <i>END</i>인지 확인</li>
* <li><i>ERROR</i> 문자열이 있을 경우 확인</li>
* 이 프로토콜은 binary data 전송을 지원하지 않는다.
* @subpackage sThread_Module
* @author JoungKyun.Kim <http://oops.org>
* @copyright (c) 2015 OOPS.ORG
* @link http://pear.oops.org/package/sThread
* memcached에 stat 명령을 전송하여 결과값을 확인한다.
* Memcached 모듈에 사용할 수 있는 모듈 option은 다음과 같다.
* <li><b>query:</b> 쿼리 문자열</li>
* sThread::execute ('domain.com:11211|query=>get foo', 2, 'tcp');
* query를 따로 지정하지 않았을 경우에는 stat명령을 실행하고
* <li>첫라인이 <i>STAT pid</i>로 시작하는지 확인</li>
* <li>마지막 라인이 <i>END</i>인지 확인</li>
* <li><i>ERROR</i> 문자열이 있을 경우 확인</li>
* 이 프로토콜은 binary data 전송을 지원하지 않는다.
* @subpackage sThread_Module
* @author JoungKyun.Kim <http://oops.org>
* @copyright (c) 2015 OOPS.ORG
* @link http://pear.oops.org/package/sThread
* 이 변수의 값이 true로 셋팅이 되면, clear_session
* method를 만들어 줘야 한다. 반대로 false 상태에서는
* clear_session method가 존재하지 않아도 상관이 없다.
* MEMCACHE 모듈이 사용하는 protocol
* MEMCACHED 모듈이 사용하는 기본 포트 번호
const MEMCACHED_REQUEST = 1;
const MEMCACHED_RESPONSE = 2;
const MEMCACHED_QUIT = 3;
const MEMCACHED_CLOSE = 4;
// {{{ (void) sThread_MEMCACHED::__construct (void)
* @return sThread_MEMCACHED
$this->port = &self::$port;
// {{{ (void) sThread_MEMCACHED::init (void)
self::$clearsession = false;
// {{{ (int) sThread_MEMCACHED::check_buf_status ($status)
* 현재 상태가 event read 상태인지 event write 상태인지
case self::MEMCACHED_REQUEST :
return Vari::EVENT_READY_SEND;
case self::MEMCACHED_RESPONSE :
return Vari::EVENT_READY_RECV;
case self::MEMCACHED_QUIT:
return Vari::EVENT_READY_SEND;
case self::MEMCACHED_CLOSE :
return Vari::EVENT_READY_CLOSE;
return Vari::EVENT_UNKNOWN;
// {{{ (string) sThread_MEMCACHED::call_status ($status, $call = false)
* 현재의 status(integer) 또는 현재 status의 handler 이름을
* @param boolean true로 설정했을 경우 현재 status의 handler
case self::MEMCACHED_REQUEST :
$r = 'MEMCACHED_REQUEST';
case self::MEMCACHED_RESPONSE :
$r = 'MEMCACHED_RESPONSE';
case self::MEMCACHED_QUIT :
$r = Vari::EVENT_UNKNOWN;
if ( $call !== false && $r !== Vari::EVENT_UNKNOWN )
// {{{ (boolean) sThread_MEMCACHED::change_status (&$sess, $key)
* @param boolean 변경한 상태가 마지막 단계일 경우 false를
* @param stdClass sThread 세션 변수 reference
if ( $sess->status[$key] === self::MEMCACHED_CLOSE )
// {{{ (void) sThread_MEMCACHED::set_last_status (&$sess, $key)
* @param stdClass sThread 세션 변수 reference
$sess->status[$key] = self::MEMCACHED_CLOSE;
// {{{ (boolean) sThread_MEMCACHED::clear_session ($key) {
* session에서 사용한 변수(self::$sess)의 값을 정리한다.
* self::$clearsession == false 일 경우, clear_session method
* Handler는 call_status 메소드에 정의된 값들 중
* Vari::EVENT_UNKNOWN를 제외한 모든 status의 constant string을
* Handler 이름은 sThread_MODULE::call_status 메소드를
* handler는 다음의 구조를 가지며, 실제로 전송을 하거나 받는
* handler_name (&$ses, $key)
* write handler는 실제로 전송을 하지 않고 전송할
* handler_name (&$sess, $key, $recv)
* read handler의 반환값은 다음과 같이 지정을 해야 한다.
* false => 전송 받을 것이 남아 있음
* 이 의미는 sThread가 read handler에서 결과값에 따라
* true는 다음 단계로 전환을 하고, false는 현 status를
* 유지하며, null의 경우 connection을 종료를 한다.
// {{{ (string) sThread_MEMCACHED::memcached_request (&$sess, $key)
* @param stdClass 세션 object
return $opt->query . "\r\n";
// {{{ (boolean) sThread_MEMCACHED::memcached_response (&$sess, $key, $recv)
* <li>첫라인이 <i>STAT pid</i>로 시작하지 않으면 오류 처리</li>
* <li>마지막 라인이 <i>END<i>이면 정상 처리</li>
* <li><i>ERROR</i> 문자열이 있을 경우 오류 처리</li>
* @param stdClass 세션 object
* @param mixed read callback에서 전송받은 누적 데이터
list ($host, $port, $type) = $sess->addr[$key];
$sess->recv[$key] .= $recv;
if ( empty ($opt->query) || $opt->query == 'stat' ) {
if ( strncmp ($sess->recv[$key], 'STAT pid ', 9) ) {
Vari::$res->status[$key] = array (
'Protocol error: Invalid response'
Vari::$res->status[$key] = array (
'Protocol error: Protocol Error'
if ( Vari::$result === true )
$sess->data[$key] = $sess->recv[$key];
unset ($sess->recv[$key]);
// {{{ (string) sThread_MEMCACHED::memcached_quit (&$sess, $key)
* @param stdClass 세션 object
|