阿里雲 OCS(Open Cache Service)雖基於 Memcached 協定,但強制要求 SASL 認證。Laravel 內建驅動未暴露設定帳密的介面,本文示範如何透過 Cache::extend() 擴充驅動,在建立 Memcached 物件後呼叫 setSaslAuthData() 完成認證設定。
Laravel 的 CacheManager::extend() 接受驅動名稱與建構閉包,閉包需回傳 Repository 實例。內建 createMemcachedDriver() 流程為:
MemcachedConnector 建立 Memcached 物件MemcachedStore 並注入 Repository我們在步驟 2 後、步驟 3 前插入 SASL 設定邏輯。
app/config/cache.php 新增三項設定:
'memcached_sasl' => 'true',
'memcached_user' => 'your_ocs_username',
'memcached_pass' => 'your_ocs_password',
bootstrap/start.php:
Cache::extend('saslMemcached', function($app) {
$servers = $app['config']['cache.memcached'];
$memcached = $app['memcached.connector']->connect($servers);
if (ini_get('memcached.use_sasl')) {
$user = $app['config']['cache.memcached_user'];
$pass = $app['config']['cache.memcached_pass'];
$memcached->setOption(Memcached::OPT_COMPRESSION, false);
$memcached->setOption(Memcached::OPT_BINARY_PROTOCOL, true);
$memcached->setSaslAuthData($user, $pass);
}
$prefix = $app['config']['cache.prefix'];
$store = new \Illuminate\Cache\MemcachedStore($memcached, $prefix);
return new \Illuminate\Cache\Repository($store);
});
'driver' => 'saslMemcached'
--enable-memcached-sasl部署後執行 Cache::put('test', 'ok', 10),若無錯誤且 Cache::get('test') 回傳 ok 即代表連線成功。