ITPub博客

首页 > 大数据 > Hadoop > php CI 实战教程:[3]Memcached 配置及调用

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

Hadoop 作者:NYY0113 时间:2014-01-15 00:55:00 0 删除 编辑

该系列和(php CodeIgniter 实战教程)同一系列以后都用CI缩写简化标题,本篇为Memcached 配置及调用实战,修改drivers下的CI_Cache_memcached部分bug,同时支持memcache,memcached兼容,完整测试is_supported save get方法。

工具/原料

  • php开发环境

  • CodeIgniter

  • memcache memcached

方法/步骤

  1. 1

    安装memcached memcache扩展(windows下没有memcached),设置端口号为11212(默认的为11211),这个配置一定要跟安装的一致,否则保存不了get出来为空的。

    在config目录下创建memcached.php配置文件,该配置会覆盖Cache_memcached.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 

    );

    ?>

  2. 2

    修改system/libraries/Cache/drivers/Cache_memcached.php 主要修改有

    1._setup_memcached()方法,原来的不兼容memcache

    2.原类中没有_default_options属性

    3.is_supported() 方法

    下面为修改后的代码,修改的地方有相关注释,也可看下面图片注释的地方:

    /**

     * 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 */

  3. 3

    在models下创建testmcmodel.php,测试is_supported save get方法。完整代码如下:

    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 "

    ";

    $is_success = $this->cache->memcached->save($key, $data, 60);

    if($is_success){

    echo "save success";

    }else{

    echo "save false";

    }

    echo "
    ===========
    ";

    $str = $this->cache->memcached->get($key);

            print_r("testMc str=".$str);

            print_r($str);

        }

        

    }

    ?>

  4. 4

    在controllers下创建testmc.php控制器,调用Model里面的方法,由于不需要视图界面,这里直接echo出一个字符串作为结束了。

    class Testmc extends CI_Controller {

    function __construct(){

    parent::__construct();

    }

    function index(){  

      $this->load->model('testmcmodel');  

    $this->load->helper('url');

    $this->testmcmodel->testMc();

    echo "
    view-end";

    // $data = "testmc";

    // $this->load->view('testmcview',$data);

    } 

    }

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

    END

注意事项

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

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

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/21232451/viewspace-1112394/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2009-03-28