-
端口号一定要跟安装的一致,否则保存不了get出来为空的
-
linux下建议使用memcached效率比较高
php CI 实战教程:Windows Memcache 配置及调用
方法/步骤1
安装memcached memcache扩展(windows下没有memcached),设置端口号为11212【window配置memcache端口号】(默认的为11211),这个配置一定要跟安装的一致,否则保存不了get出来为空的。
在config目录下创建memcached.php配置文件,该配置会覆盖Cache_memcached.php中默认的配置,内容如下:
<?php
if (! defined ( 'BASEPATH' ))
exit ( 'No direct script access allowed' );
$config ['memcached'] = array (
'hostname' => '127.0.0.1',
'port' => 11212,//default port is 11211
'weight' => 1
);
?>
修改system/libraries/Cache/drivers/Cache_memcached.php 主要修改有
1._setup_memcached()方法,原来的不兼容memcache
2.原类中没有_default_options属性
3.is_supported() 方法
下面为修改后的代码,修改的地方有相关注释,也可看下面图片注释的地方:
<?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 - 2012 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(
'default_host' => '127.0.0.1',
'default_port' => 11211,
'default_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;
}
}
}
//$this->_memcached = new Memcached();// compatibility memcached memcache
if (extension_loaded('memcached')){
$this->_memcached = new Memcached();
}else{
$this->_memcached = new Memcache();
}
foreach ($this->_memcache_conf as $name => $cache_server)
{
if ( ! array_key_exists('hostname', $cache_server))
{
//$cache_server['hostname'] = $this->_default_options['default_host'];//no _default_options
$cache_server['hostname'] = $this->_memcache_conf['default']['default_host'];
}
if ( ! array_key_exists('port', $cache_server))
{
$cache_server['port'] = $this->_memcache_conf['default']['default_port'];//no _default_options
}
if ( ! array_key_exists('weight', $cache_server))
{
$cache_server['weight'] = $this->_memcache_conf['default']['default_weight'];//no _default_options
}
// $this->_memcached->addServer(
// $cache_server['hostname'], $cache_server['port'], $cache_server['weight']
// );
if (extension_loaded('memcached')){
$this->_memcached->addServer(
$cache_server['hostname'], $cache_server['port'], $cache_server['weight']
);
}else{
$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'))//if ( ! extension_loaded('memcached'))
{
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 */
-
在models下创建testmcmodel.php,测试is_supported save get方法。完整代码如下:
<?php
class Testmcmodel extends CI_Model {
function __construct() {
parent::__construct ();
$this->load->database ();
}
function testMc()
{
$this->load->driver('cache');
//save($id, $data, $ttl = 60)
$key = 'testmckey';
$data = time();
if($this->cache->memcached->is_supported()){
echo "supported memcached";
}else{
echo "not supported memcached";
}
echo "<br><br>";
$is_success = $this->cache->memcached->save($key, $data, 60);
if($is_success){
echo "save success";
}else{
echo "save false";
}
echo "<br>===========<br>";
$str = $this->cache->memcached->get($key);
print_r("testMc str=".$str);
print_r($str);
}
}
?>
-
在controllers下创建testmc.php控制器,调用Model里面的方法,由于不需要视图界面,这里直接echo出一个字符串作为结束了。
<?php
class Testmc extends CI_Controller {
function __construct(){
parent::__construct();
}
function index(){
$this->load->model('testmcmodel');
$this->load->helper('url');
$this->testmcmodel->testMc();
echo "<br>view-end";
// $data = "testmc";
// $this->load->view('testmcview',$data);
}
}
最终输出的结果如图所示:
发表评论
要发表评论,您必须先登录。