Настройка сервера кеша в приложении Laravel, размещенном в облаке

Я использую фреймворк 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 для использования такого имени пользователя и пароля? Если да, у вас есть рекомендации о том, как начать это делать?

2

Решение

Я просто расследовал то же самое. Кажется, есть два способа сделать это.

  1. Вы можете создать свое собственное расширение Cache. http://laravel.com/docs/4.2/extending#cache

  2. Вы расширяете \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.

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 зарегистрированы как переменные среды в приложении Heroku.

1

По вопросам рекламы [email protected]