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, $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, ], ], ],
至此完工,尽情享用吧。