zoukankan      html  css  js  c++  java
  • laravel 框架memcache的配置

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

    找到sessioni管理器 Laravelvendor/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 IlluminateCache;
    
    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 IlluminateCache;
    
    use Memcache;
    use IlluminateContractsCacheStore;
    
    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, $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.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,
            ],
        ],
    ],
    复制代码

    至此完工,尽情享用吧。

  • 相关阅读:
    arm基础知识1
    安装Yellowfin报错——No such file or directory: '/tmp/pip-build-jykvuD/YellowFin/README.md'
    下载kaggle数据集,验证手机号
    调参必备---GridSearch网格搜索
    sklearn.metrics.roc_curve
    & | and or
    16个推荐系统开放公共数据集整理分享
    tensorflow ConfigProto
    python __future__ 使用
    tf idf公式及sklearn中TfidfVectorizer
  • 原文地址:https://www.cnblogs.com/2017sss/p/5743396.html
Copyright © 2011-2022 走看看