php CI 实战教程:Windows Memcache 配置及调用

2016.08.12 No Comments

方法/步骤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 */

php CI 实战教程:[3]Memcached 配置及调用
php CI 实战教程:[3]Memcached 配置及调用
  • 在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);

    }

    }

    最终输出的结果如图所示:

    php CI 实战教程:[3]Memcached 配置及调用
    php CI 实战教程:[3]Memcached 配置及调用

    注意事项

    • 端口号一定要跟安装的一致,否则保存不了get出来为空的

    • linux下建议使用memcached效率比较高

Related Posts:

发表评论