您的位置:首页 > 数据库 > Memcache

让laravel5支持memcache

2016-06-26 21:59 561 查看
转自:http://www.cnblogs.com/tyjsjl/p/5572993.html

Laravel5框架在Cache和Session中不支持Memcache,看清了是Memcache而不是Memcached哦,MemCached是支持的但是这个扩展真的是装的蛋疼,只有修改部分源码让其来支持memcache了。具体修改部分如下:

找到sessioni管理器 Laravel\vendor/laravel/framework/src/Illuminate/Session/SessionManager.php,并增加如下代码:
/**

     * Create an instance of the Memcached session driver.

     *

     * @return IlluminateSessionStore

     */

    protected function createMemcacheDriver()

    {

        return $this->createCacheBased('memcache');

    }
接下来修改cache部分,找到Laravel/vendor/laravel/framework/src/Illuminate/Cache/CacheManager.php
在该文件中增加以下代码:

/**

     * Create an instance of the Memcache cache driver.

     *

     * @return IlluminateCacheMemcachedStore

     */

    protected function createMemcacheDriver(array $config)

    {

        $prefix = $this->getPrefix($config);

        $memcache = $this->app['memcache.connector']->connect($config['servers']);

        return $this->repository(new MemcacheStore($memcache, $prefix));

    }

接下来找到文件: Laravel/vendor/laravel/framework/src/Illuminate/Cache/CacheServiceProvider.php 将memcache注册进去
修改如下:

/**

     * Register the service provider.

     *

     * @return void

     */

    public function register()

    {

        $this->app->singleton('cache', function ($app) {

            return new CacheManager($app);

        });

        $this->app->singleton('cache.store', function ($app) {

            return $app['cache']->driver();

        });

        $this->app->singleton('memcached.connector', function () {

            return new MemcachedConnector;

        });

        $this->app->singleton('memcache.connector',function() {

       // 这里返回了MemcacheConnector,记得在Cache目录下创建这个class

            return new MemcacheConnector;

        });

        $this->registerCommands();

    }

/**

     * Get the services provided by the provider.

     *

     * @return array

     */

    public function provides()

    {

        return [

            'cache', 'cache.store', 'memcached.connector', 'command.cache.clear','memcache.connector'

        ];

    }

我们看到这个闭包函数中返回了MemcacheContector的对象,现在来创建此类。文件位置:Laravel/vendor/laravel/framework/src/Illuminate/Cache/MemcacheConnector.php

<?php

namespace Illuminate\Cache;

use Memcache;

use RuntimeException;

class MemcacheConnector {

    /**

     * Create a new Memcached connection.

     *

     * @param array  $servers

     * @return Memcache

     */

    public function connect(array $servers)

    {

        $memcache = $this->getMemcache();

        // For each server in the array, we'll just extract the configuration and add

        // the server to the Memcache connection. Once we have added all of these

        // servers we'll verify the connection is successful and return it back.

        foreach ($servers as $server)

        {

            $memcache->addServer($server['host'], $server['port'], $server['weight']);

        }

        if ($memcache->getVersion() === false)

        {

            throw new RuntimeException("Could not establish Memcache connection.");

        }

        return $memcache;

    }

    /**

     * Get a new Memcache instance.

     *

     * @return Memcached

     */

    protected function getMemcache()

    {

        return new Memcache;

    }

}

按照第二步的流程这个文件会执行connect的方法,执行完成之后返回一个Memcache的对象, 这时候第二步那里根据这边来创建了一个MemcacheStore的存储器。

文件地址:Laravel/vendor/laravel/framework/src/Illuminate/Cache/MemcacheStore.php
<?php

namespace Illuminate\Cache;

use Memcache;

use Illuminate\Contracts\Cache\Store;

class MemcacheStore extends TaggableStore implements Store

{

    /**

     * The Memcached instance.

     *

     * @var \Memcached

     */

    protected $memcached;

    /**

     * A string that should be prepended to keys.

     *

     * @var string

     */

    protected $prefix;

    public function __construct(Memcache $memcache,
4000
$prefix = '')

    {

        $this->memcache = $memcache;

        $this->prefix = strlen($prefix) > 0 ? $prefix.':' : '';

    }

    /**

     * Retrieve an item from the cache by key.

     *

     * @param  string|array  $key

     * @return mixed

     */

    public function get($key)

    {

        return $this->memcache->get($this->prefix.$key);

    }

    /**

     * Retrieve multiple items from the cache by key.

     *

     * Items not found in the cache will have a null value.

     *

     * @param  array  $keys

     * @return array

     */

    public function many(array $keys)

    {

        $prefixedKeys = array_map(function ($key) {

            return $this->prefix.$key;

        }, $keys);

        $values = $this->memcache->getMulti($prefixedKeys, null, Memcache::GET_PRESERVE_ORDER);

        if ($this->memcache->getResultCode() != 0) {

            return array_fill_keys($keys, null);

        }

        return array_combine($keys, $values);

    }

    /**

     * Store an item in the cache for a given number of minutes.

     *

     * @param  string  $key

     * @param  mixed   $value

     * @param  int     $minutes

     * @return void

     */

    public function put($key, $value, $minutes)

    {

        $compress = is_bool($value) || is_int($value) || is_float($value) ? false : MEMCACHE_COMPRESSED;

        $this->memcache->set($this->prefix.$key, $value, $compress, $minutes * 60);

    }

    /**

     * Store multiple items in the cache for a given number of minutes.

     *

     * @param  array  $values

     * @param  int  $minutes

     * @return void

     */

    public function putMany(array $values, $minutes)

    {

        $prefixedValues = [];

        foreach ($values as $key => $value) {

            $prefixedValues[$this->prefix.$key] = $value;

        }

        $this->memcache->setMulti($prefixedValues, $minutes * 60);

    }

     /**

     * Store an item in the cache if the key doesn't exist.

     *

     * @param  string  $key

     * @param  mixed   $value

     * @param  int     $minutes

     * @return bool

     */

    public function add($key, $value, $minutes)

    {

        return $this->memcache->add($this->prefix.$key, $value, $minutes * 60);

    }

    /**

     * Increment the value of an item in the cache.

     *

     * @param  string  $key

     * @param  mixed   $value

     * @return int|bool

     */

    public function increment($key, $value = 1)

    {

        return $this->memcache->increment($this->prefix.$key, $value);

    }

    /**

     * Decrement the value of an item in the cache.

     *

     * @param  string  $key

     * @param  mixed   $value

     * @return int|bool

     */

    public function decrement($key, $value = 1)

    {

        return $this->memcache->decrement($this->prefix.$key, $value);

    }

    /**

     * Store an item in the cache indefinitely.

     *

     * @param  string  $key

     * @param  mixed   $value

     * @return void

     */

    public function forever($key, $value)

    {

        $this->put($key, $value, 0);

    }

    /**

     * Remove an item from the cache.

     *

     * @param  string  $key

     * @return bool

     */

    public function forget($key)

    {

        return $this->memcache->delete($this->prefix.$key);

    }

    /**

     * Remove all items from the cache.

     *

     * @return void

     */

    public function flush()

    {

        $this->memcache->flush();

    }

    /**

     * Get the underlying Memcached connection.

     *

     * @return \Memcached

     */

    public function getMemcached()

    {

        return $this->memcache;

    }

    /**

     * Get the cache key prefix.

     *

     * @return string

     */

    public function getPrefix()

    {

        return $this->prefix;

    }

    /**

     * Set the cache key prefix.

     *

     * @param  string  $prefix

     * @return void

     */

    public function setPrefix($prefix)

    {

        $this->prefix = ! empty($prefix) ? $prefix.':' : '';

    }

}

上述步骤操作完成后,接下来修改一下config/cache.php中的驱动部分,增加如下代码段:

// 修改为memcached

'default' => env('CACHE_DRIVER', 'memcache'),

// stores 部分增加memcache配置

'memcache' => [

    'driver'  => 'memcache',

    'servers' => [

        [

            'host' => env('MEMCACHED_HOST', '127.0.0.1'),

            'port' => env('MEMCACHED_PORT', 11211),

            'weight' => 100,

        ],

    ],

],
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  memcache 框架 缓存 php