Я использую фреймворк 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 для использования такого имени пользователя и пароля? Если да, у вас есть рекомендации о том, как начать это делать?
Я просто расследовал то же самое. Кажется, есть два способа сделать это.
Вы можете создать свое собственное расширение Cache. 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
, В соответствии с http://php.net/manual/en/memcached.setsaslauthdata.php
Вы можете установить учетные данные аутентификации SASL для экземпляра Memcached.
Таким образом, вы могли бы подкласс \Illuminate\Cache\MemcachedConnector
и привязать его к $app['memcached.connector']
в вашем собственном поставщике услуг. Ваш подкласс может затем переопределить getMemcached()
включить учетные данные. Подробнее о базовых расширениях IoC: http://laravel.com/docs/4.2/extending#ioc-based-extension.
Благодаря @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 зарегистрированы как переменные среды в приложении Heroku.