感谢@tscheepers和@atyagi,这里是我用来使它与Memcached云和Heroku一起使用的代码。
我还在Packagist和Github上发了一个包, https://github.com/kintso/memcachedcloud-laravel
创建Memcached云连接器
class MemcachedCloudConnector { /** * Extend the Memcached connection to use MemcachedCloud via Heroku * * @param array $servers * @throws \RuntimeException * @return \Memcached */ public function connect(array $servers) { $memcached = $this->getMemcached(); // Set Elasticache options here if (defined('\Memcached::OPT_BINARY_PROTOCOL')) { $memcached->setOption(Memcached::OPT_BINARY_PROTOCOL, true); } $memcached->addServers(array_map(function($server) { return explode(':', $server, 2); }, explode(',', $_ENV['MEMCACHEDCLOUD_SERVERS']))); $memcached->setSaslAuthData($_ENV['MEMCACHEDCLOUD_USERNAME'], $_ENV['MEMCACHEDCLOUD_PASSWORD']); if ($memcached->getVersion() === false) { throw new \RuntimeException("Could not establish Memcached connection."); } return $memcached; } /** * Get a new Memcached instance. * * @return \Memcached */ protected function getMemcached() { return new Memcached; } }
通过服务提供商将其绑定到IoC
// Based on https://github.com/atyagi/elasticache-laravel class MemcachedCloudServiceProvider extends ServiceProvider { /** * Indicates if loading of the provider is deferred. * * @var bool */ protected $defer = false; /** * Register the service provider. * * @return void */ public function register() { $servers = $this->app['config']->get('cache.memcached'); $memcachedCloud = new MemcachedCloudConnector(); $memcached = $memcachedCloud->connect($servers); $this->app->getProviderRepository()->load($this->app, array('Illuminate\Cache\CacheServiceProvider')); $this->app->make('cache')->extend('memcached', function() use ($memcached) { /** @noinspection PhpUndefinedNamespaceInspection */ /** @noinspection PhpUndefinedClassInspection */ return new \Illuminate\Cache\Repository( new \Illuminate\Cache\MemcachedStore($memcached, $this->app['config']->get('cache.prefix'))); }); } /** * Get the services provided by the provider. * * @return array */ public function provides() { return array(); } }
不要忘记在app.php文件中引用新的服务提供者,并确保您的Memcached ID在Heroku应用程序中注册为环境变量。
我只是在研究同样的事情。似乎有两种方法可以解决它。
您可以创建自己的缓存扩展。 http://laravel.com/docs/4.2/extending#cache
你扩展 \Illuminate\Cache\MemcachedConnector 包括 setSaslAuthData 调用并将其绑定到IoC容器中。
\Illuminate\Cache\MemcachedConnector
setSaslAuthData
该 MemcachedConnector 课堂( https://github.com/laravel/framework/blob/4.2/src/Illuminate/Cache/MemcachedConnector.php ) 有个 getMemcached() 返回实例的方法 Memcached 。根据 http://php.net/manual/en/memcached.setsaslauthdata.php 您可以在Memcached实例上设置SASL身份验证凭据。
MemcachedConnector
getMemcached()
Memcached
http://php.net/manual/en/memcached.setsaslauthdata.php
所以你可以继承 \Illuminate\Cache\MemcachedConnector 并将其绑定到 $app['memcached.connector'] 在您自己的服务提供商。你的子类然后可以覆盖 getMemcached() 包括凭据。有关IoC基本扩展的更多信息: http://laravel.com/docs/4.2/extending#ioc-based-extension 。
$app['memcached.connector']