TIP게시판

제목 CI_Cache_memcached 드라이버 버그 수정
글쓴이 한글이 작성시각 2012/02/22 10:22:44
댓글 : 2 추천 : 0 스크랩 : 0 조회수 : 17103   RSS
CI_Cache_memcached가 memcached lib은 사용이 잘되는데 memcache lib은 사용이 안되더라구요.
윈도우에서 테스트를 하다보니 memcache 밖에 사용이 안되서 드라이버를 수정 했습니다.
보니깐 save에는 memcached와 memcache를 나눠서 사용했던데 다른부분에서는 체크를 안해 놨더군요.
그래서 제가 좀 수정을 했습니다.
그 소스를 올릴려 했는데 버그 트래킹에 확인해 보니 이미 수정사항에 있더군요.
반영좀 빨리 해주지 6개월전꺼더만;;;

github.com/EllisLab/CodeIgniter/issues/45

에 있습니다.

이것과 제소스가 거의 차이가 없습니다.
addServer 하는 부분에서 차이가 있어서 이부분만 더 수정하면 되겠더군요.

아래 소스는 제가 수정한 내용입니다.

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/**
 * CodeIgniter
 *
 * An open source application development framework for PHP 4.3.2 or newer
 *
 * @package  CodeIgniter
 * @author  ExpressionEngine Dev Team
 * @copyright Copyright (c) 2006 - 2011 EllisLab, Inc.
 * @license  http://codeigniter.com/user_guide/license.html
 * @link  http://codeigniter.com
 * @since  Version 2.0
 * @filesource 
 */

// ------------------------------------------------------------------------

/**
 * CodeIgniter Memcached Caching Class 
 *
 * @package  CodeIgniter
 * @subpackage Libraries
 * @category Core
 * @author  ExpressionEngine Dev Team
 * @link  
 */

class CI_Cache_memcached extends CI_Driver {

 private $_memcached; // Holds the memcached object

 protected $_memcache_conf  = array(
     'default' => array(
      'hostname'  => '127.0.0.1',
      'port'  => 11211,
      'weight' => 1
     )
    );

 // ------------------------------------------------------------------------ 

 /**
  * Fetch from cache
  *
  * @param  mixed  unique key id
  * @return  mixed  data on success/false on failure
  */ 
 public function get($id)
 { 
  $data = $this->_memcached->get($id);
  
  return (is_array($data)) ? $data[0] : FALSE;
 }

 // ------------------------------------------------------------------------

 /**
  * Save
  *
  * @param  string  unique identifier
  * @param  mixed  data being cached
  * @param  int   time to live
  * @return  boolean  true on success, false on failure
  */
 public function save($id, $data, $ttl = 60)
 {
  if (get_class($this->_memcached) == 'Memcached')
  {
   return $this->_memcached->set($id, array($data, time(), $ttl), $ttl);
  }
  else if (get_class($this->_memcached) == 'Memcache')
  {
   return $this->_memcached->set($id, array($data, time(), $ttl), 0, $ttl);
  }
  
  return FALSE;
 }

 // ------------------------------------------------------------------------
 
 /**
  * Delete from Cache
  *
  * @param  mixed  key to be deleted.
  * @return  boolean  true on success, false on failure
  */
 public function delete($id)
 {
  return $this->_memcached->delete($id);
 }

 // ------------------------------------------------------------------------
 
 /**
  * Clean the Cache
  *
  * @return  boolean  false on failure/true on success
  */
 public function clean()
 {
  return $this->_memcached->flush();
 }

 // ------------------------------------------------------------------------

 /**
  * Cache Info
  *
  * @param  null  type not supported in memcached
  * @return  mixed   array on success, false on failure
  */
 public function cache_info($type = NULL)
 {
  return $this->_memcached->getStats();
 }

 // ------------------------------------------------------------------------
 
 /**
  * Get Cache Metadata
  *
  * @param  mixed  key to get cache metadata on
  * @return  mixed  FALSE on failure, array on success.
  */
 public function get_metadata($id)
 {
  $stored = $this->_memcached->get($id);

  if (count($stored) !== 3)
  {
   return FALSE;
  }

  list($data, $time, $ttl) = $stored;

  return array(
   'expire' => $time + $ttl,
   'mtime'  => $time,
   'data'  => $data
  );
 }

 // ------------------------------------------------------------------------

 /**
  * Setup memcached.
  */
 private function _setup_memcached()
 {
  // Try to load memcached server info from the config file.
  $CI =& get_instance();
  if ($CI->config->load('memcached', TRUE, TRUE))
  {
   if (is_array($CI->config->config['memcached']))
   {
    $this->_memcache_conf = NULL;

    foreach ($CI->config->config['memcached'] as $name => $conf)
    {
     $this->_memcache_conf[$name] = $conf;
    }    
   }   
  }
  
  if (extension_loaded('memcached'))
  {
   $this->_memcached = new Memcached();
  }
  else if (extension_loaded('memcache'))
  {
   $this->_memcached = new Memcache();
  } else {
   log_message('error', 'The Memcached Extension must be loaded to use Memcached Cache.');
   
   return FALSE;
  }

  foreach ($this->_memcache_conf as $name => $cache_server)
  {
   if ( ! array_key_exists('hostname', $cache_server))
   {
    $cache_server['hostname'] = $this->_default_options['default_host'];
   }
 
   if ( ! array_key_exists('port', $cache_server))
   {
    $cache_server['port'] = $this->_default_options['default_port'];
   }
 
   if ( ! array_key_exists('weight', $cache_server))
   {
    $cache_server['weight'] = $this->_default_options['default_weight'];
   }
   
   if (get_class($this->_memcached) == 'Memcached')
   {
    $this->_memcached->addServer(
     $cache_server['hostname'], $cache_server['port'], $cache_server['weight']
    );
   }
   else if (get_class($this->_memcached) == 'Memcache')
   {
    $this->_memcached->addServer(
     $cache_server['hostname'], $cache_server['port'], TRUE, $cache_server['weight']
    );
   }
 
   
  }
 }

 // ------------------------------------------------------------------------


 /**
  * Is supported
  *
  * Returns FALSE if memcached is not supported on the system.
  * If it is, we setup the memcached object & return TRUE
  */
 public function is_supported()
 {
  if ( ! extension_loaded('memcached') && ! extension_loaded('memcache'))
  {
   log_message('error', 'The Memcached Extension must be loaded to use Memcached Cache.');
   
   return FALSE;
  }
  
  $this->_setup_memcached();
  return TRUE;
 }

 // ------------------------------------------------------------------------

}
// End Class

/* End of file Cache_memcached.php */
/* Location: ./system/libraries/Cache/drivers/Cache_memcached.php */




태그 Memcached,Memcache
 다음글 Hook을 이용한 preload 이이지 구현에 대한 추... (3)
 이전글 HMVC 5.4 & Template_ 타로구조 ... (2)

댓글

변종원(웅파) / 2012/02/22 18:14:38 / 추천 0
memcache에 그런 버그가 있었네요. 
한대승(불의회상) / 2012/02/22 19:33:29 / 추천 0
좋은 정보 감사 합니다.