我使用的是Laravel框架,我在Heroku上托管我的登台和制作环境。
我想使用Memcached等缓存。在我的本地机器上,一切运行正常,我可以存储值并在我运行的缓存中检索它们。
然而,一旦部署在Heroku上,设置和访问缓存中的密钥不会做任何事情都不会导致错误。
经过一番调查,我认为问题在于我使用的Memcached服务的连接(在我的案例中是Memcached云)。
如何为我的登台和制作环境设置Laravel以连接到外部Memcached提供程序?
我尝试使用在我的应用程序上安装Memcached云后提供的用户名和密码,但Laravel不使用它们。
在cache.php中
$memcachedURL = parse_url(getenv("MEMCACHEDCLOUD_SERVERS"));
...
'memcached' => array(
array(
'host' => $memcachedURL["host"],
'port' => $memcachedURL["port"],
'weight' => 100,
'username' => getenv("MEMCACHEDCLOUD_USERNAME"),
'password' => getenv("MEMCACHEDCLOUD_PASSWORD")
),
)
我应该编写一个Memcached连接器来使用这样的用户名和密码吗?如果是的话,你会参考一下如何开始这样做吗?
答案 0 :(得分:1)
我只是在研究同样的事情。似乎有两种方法可以解决它。
您可以创建自己的缓存扩展程序。 http://laravel.com/docs/4.2/extending#cache
您将\Illuminate\Cache\MemcachedConnector
扩展为包含setSaslAuthData
调用并将其绑定到IoC容器中。
MemcachedConnector
类(https://github.com/laravel/framework/blob/4.2/src/Illuminate/Cache/MemcachedConnector.php)有一个getMemcached()
方法,它返回Memcached
的实例。根据{{1}},您可以在Memcached实例上设置SASL身份验证凭据。
因此,您可以将http://php.net/manual/en/memcached.setsaslauthdata.php
子类化并将其绑定到您自己的服务提供商中的\Illuminate\Cache\MemcachedConnector
。然后,您的子类可以覆盖$app['memcached.connector']
以包含凭据。有关IoC基本扩展的更多信息:http://laravel.com/docs/4.2/extending#ioc-based-extension。
答案 1 :(得分:1)
感谢@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应用程序中的环境变量。