在云上托管的Laravel应用程序上配置缓存服务器


Configuring a cache server on a Laravel application hosted on the cloud

我使用的是Laravel框架,我在Heroku上托管我的登台和生产环境。

我想使用像Memcached这样的缓存。在我的本地机器上,一切都运行良好,我可以存储值并在我运行的缓存中检索它们。

然而,一旦部署在Heroku上,设置和访问缓存中的密钥不会起任何作用,也不会导致错误。

经过一番调查,我认为问题出在与我使用的Memcached服务(在我的案例中是Memcached云)的连接上。

如何为我的暂存和生产环境设置Laravel以连接到外部Memcached提供商?

我尝试使用在我的应用程序上安装Memcached云后提供的用户名和密码,但Laravel没有使用它们。

在缓存中.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连接器来使用这样的用户名和密码吗?如果是的话,你能提供一些关于如何开始做的参考吗?

我只是在调查同样的事情。这似乎有两种方法。

  1. 您可以创建自己的缓存扩展。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)具有返回CCD_ 5的实例的CCD_。根据http://php.net/manual/en/memcached.setsaslauthdata.php,您可以在Memcached实例上设置SASL身份验证凭据。

因此,您可以在自己的服务提供商中将'Illuminate'Cache'MemcachedConnector子类化并绑定到$app['memcached.connector']。然后,子类可以覆盖getMemcached()以包含凭据。有关IoC基础扩展的更多信息:http://laravel.com/docs/4.2/extending#ioc-基于扩展。

感谢@tschepers和@atyagi,下面是我用来让它与Memcached cloud和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应用程序中注册为环境变量。