Friday, May 11, 2012

Some link research about memcache

Memcache in Zend Framework
http://zendcoding.com/how-to-use-memcached-in-the-zend-framework
http://lenss.nl/2010/01/cache-data-with-zend-framework-and-memcached/
http://perevodik.net/en/posts/14/

Set memcache in PHP
http://www.dotdeb.org/2008/08/25/storing-your-php-sessions-using-memcached/

Install Memcache 
aptitude install memcached
aptitude install php5-memcache


Check install memcache
php -m | grep memcache


Check memcache is run
$ ps -aux | grep memcached
nobody 20965 0.0 0.5 42900 23072 ? S Jan28 0:01 /usr/bin/memcached -m 64 -p 11211 -u nobody -l 127.0.0.1
root 22393 0.0 0.0 87940 776 pts/0 R+ 12:06 0:00 grep memcached


$ netstat -an | grep 11211
tcp 0 0 127.0.0.1:11211 0.0.0.0:* LISTEN


Setup application.ini in Zend Framework
cache.backend.type = Memcached
cache.backend.options.servers.1.host = 127.0.0.1
cache.backend.options.servers.1.port = 11211
cache.backend.options.servers.1.persistent = true
cache.backend.options.servers.1.weight = 1
cache.backend.options.servers.1.timeout = 5
cache.backend.options.servers.1.retry_interval = 15


OR

  1. resources.session.saveHandler.class = "App_Session_SaveHandler_Cache"
  2. resources.session.saveHandler.options.type = "Libmemcached"
  3. resources.session.saveHandler.options.maxlifetime = 300
  4. resources.session.saveHandler.options.front.lifetime = 300
  5. resources.session.saveHandler.options.front.automatic_serialization = true
  6. resources.session.saveHandler.options.back.servers.0.host = "127.0.0.1"
  7. resources.session.saveHandler.options.back.servers.0.port = 11211
  8. resources.session.saveHandler.options.back.servers.0.persistent = true
  9. resources.session.saveHandler.options.back.servers.0.status = true
  10. resources.session.saveHandler.options.back.servers.1.host = "127.0.0.2"
  11. resources.session.saveHandler.options.back.servers.1.port = 11211
  12. resources.session.saveHandler.options.back.servers.1.persistent = true
  13. resources.session.saveHandler.options.back.servers.1.status = true

    1. protected function _initForceSession()
    2. {  
    3.     $this->bootstrap('session');
    4.     Zend_Session::start();
    5. }



Add this function in bootstrap

protected function _initCache()
{
        $options = $this->getOptions();


        if (isset($options['cache'])) {
            $cache = Zend_Cache::factory(
                $options['cache']['frontend']['type'],
                $options['cache']['backend']['type'],
                $options['cache']['frontend']['options'],
                $options['cache']['backend']['options']
            );


            Zend_Registry::set('cache', $cache);
            return $cache;
        }
}


OR



/**
     * Initialize the Cache Manager
     * Initializes the memcached cache into
     * the registry and returns the cache manage.
     * @return Zend_Cache_Manager
     */
    protected function _initCachemanager()
    {
        $cachemanager = $this->getPluginResource('cachemanager')
                             ->init();
 
        // fetch the current revision from svn and use it as a prefix
        // why: we do not want to restart memcached, or you will lose sessions.
        if (!$appVersion = apc_fetch('progsite_version')) {
            $dir = getcwd();
            chdir(dirname(__FILE__));
            $appVersion = filter_var(`svn info | grep "Revision"`, FILTER_SANITIZE_NUMBER_INT);
            chdir($dir);
            unset($dir);
            if (!$appVersion) {
                $appVersion = mt_rand(0, 99999); // simply handles an export instead of checkout
            }
            apc_store('progsite_version', $appVersion);
        }
 
        $memcached = $cachemanager->getCache('memcached');
        $memcached->setOption('cache_id_prefix', APPLICATION_ENV . '_' . $appVersion);
 
        return $cachemanager;
    } 
protected function _initSessionId()
    {   
        $this->bootstrap('session');
        $opts = $this->getOptions();
        if ('Zend_Session_SaveHandler_Cache' == $opts['resources']['session']['saveHandler']['class']) {
            $cache = $this->bootstrap('cachemanager')
                          ->getResource('cachemanager')
                          ->getCache('memcached');
            Zend_Session::getSaveHandler()->setCache($cache);
        }
        $defaultNamespace = new Zend_Session_Namespace();
        if (!isset($defaultNamespace->initialized)) {
            Zend_Session::regenerateId();
            $defaultNamespace->initialized = true;
        }
    }





Or set memcache

resources.session.saveHandler.class = "App_Session_SaveHandler_Cache"
resources.session.saveHandler.options.type = "Libmemcached"
resources.session.saveHandler.options.maxlifetime = 300
resources.session.saveHandler.options.front.lifetime = 300
resources.session.saveHandler.options.front.automatic_serialization = true
resources.session.saveHandler.options.back.servers.0.host = "127.0.0.1"
resources.session.saveHandler.options.back.servers.0.port = 11211
resources.session.saveHandler.options.back.servers.0.persistent = true
resources.session.saveHandler.options.back.servers.0.status = true
resources.session.saveHandler.options.back.servers.1.host = "127.0.0.2"
resources.session.saveHandler.options.back.servers.1.port = 11211
resources.session.saveHandler.options.back.servers.1.persistent = true
resources.session.saveHandler.options.back.servers.1.status = true

The session save handler class (App_Session_SaveHanlder_Cache implements Zend_Session_SaveHandler_Interface and uses Zend_Cache factory passing in the Libmemcached option for the backend storage.
In my bootstrap, I have an _init method listed as the first method which calls the session bootstrap:

protected function _initForceSession()
{   
    $this->bootstrap('session');
    Zend_Session::start();
}



Use cache in webservice

$cache = Zend_Registry::get('cache');
$cache->setLifetime(86400);


$client = new Client();
$client->setCache($cache);





No comments:

Post a Comment