Laravelでの拡張Memcachedキャッシュ駆動によるアリクラウドOCSキャッシュの使用
5780 ワード
Laravelは私が最近たくさん使っていて、使えば使うほど好きなPHPフレームワークです.下向きの互換性のない歴史的な重荷のため、完全にオブジェクト向けのスタイルで、Facadesの優雅なIoC Containerを借りて実現し、Composerを採用してパッケージ管理を行い、オープンソースコミュニティの優れたコンポーネントを簡単に導入し、使用することができます......要するに、これは本当にあなたに「コードハッピー」の「巨匠級PHP開発フレームワーク」.
自分のLaravel Appをアリクラウドに配備しようとしたところ、LaravelはMemcachedキャッシュをサポートしており、アリクラウドのOCSもMemcachedベースのキャッシュであるが、アリクラウドOCSはSASL認証を採用しているが、LaravelのMemcachedドライバは関連する方法を実現しておらず、サーバ上でPHP Memcachedをコンパイルする際にSASL承認を有効にしてもユーザー名とパスワードを設定することはできません.
Laravelでは、このような問題を解決するには、多くの方法があります.Laravel独自のMemcachedドライバを拡張し、Memcachedオブジェクト自体のsetSaslAuthDataメソッドを通じて、ユーザー名とパスワードを指定する最も迅速で手間のかかる方法を選択しました.
背景知識
IlluminateCacheCacheManagerを使用したextendメソッドです(IlluminateSupportManagerから継承されます).まず、このメソッドの定義を見てみましょう.
このメソッドでは、2つのパラメータが受信されます.1つ目は、カスタム駆動名を表す文字列です.2つ目は、カスタム駆動を呼び出すときに実行するメソッドです.IlluminateCacheCacheManagerのソースコードを読むと、ドライバを作成する関数がIlluminateCacheRepositoryの例:IlluminateCacheRepositoryのコンストラクション関数は次のとおりです.
IlluminateCacheStoreInterfaceインタフェースを実装するオブジェクトが必要です.このインタフェースにはCacheオブジェクトが実行できる方法が定義されています.既存のMemcachedキャッシュドライバを拡張する計画なので、IlluminateCacheCacheManagerのソースコードでは、LaravelがMemcachedドライバをこのように作成していることがわかります.
まず、プロファイルから定義したMemcachedサーバを読み込み、Memcachedオブジェクトを作成します(IlluminateCacheMemcachedConnectorによって実装され、実際には標準のMemcachedオブジェクトを作成し、MemcachedのaddServerメソッドを呼び出して接続するサーバを指定し、インスタンス化されたMemcachedオブジェクトを返します).
独自のキャッシュ駆動を拡張
上記の背景知識を理解したら、自分のキャッシュ駆動を拡張することができます.考え方は以下の通りです.
1.app/config/cache.phpファイルに、「sasl認証を使用するかどうか」、「sasl認証アカウント」、「sasl認証パスワード」を設定する3つの構成項目を追加します.2.bootstrap/start.phpファイルでCache::extendメソッド拡張ドライバを呼び出します.3.app/config/cache.phpファイルでdriver構成項目を変更し、システムが独自に拡張されたドライバを使用することを指定します.
構成アイテムの追加
まず、app/config/cache.phpファイルを開き、次のものを見つけます.
次のように変更します.
拡張ドライブ
次にbootstrap/start.phpファイルを開き、最後の行return$app;前にコードを挿入します.
構成を変更し、独自の拡張キャッシュドライバを使用
app/config/cache.phpファイルを開き、次のものを見つけます.
次のように変更します.
これで、あなたのアリクラウドECSサーバーで、LaravelにアリクラウドOCSキャッシュサービスを使用させることができます.(PHPがMemcached拡張をサポートし、SASL認証を有効にすることを前提としています.参考:http://help.aliyun.com/doc/view/13553932.html
自分のLaravel Appをアリクラウドに配備しようとしたところ、LaravelはMemcachedキャッシュをサポートしており、アリクラウドのOCSもMemcachedベースのキャッシュであるが、アリクラウドOCSはSASL認証を採用しているが、LaravelのMemcachedドライバは関連する方法を実現しておらず、サーバ上でPHP Memcachedをコンパイルする際にSASL承認を有効にしてもユーザー名とパスワードを設定することはできません.
Laravelでは、このような問題を解決するには、多くの方法があります.Laravel独自のMemcachedドライバを拡張し、Memcachedオブジェクト自体のsetSaslAuthDataメソッドを通じて、ユーザー名とパスワードを指定する最も迅速で手間のかかる方法を選択しました.
背景知識
IlluminateCacheCacheManagerを使用したextendメソッドです(IlluminateSupportManagerから継承されます).まず、このメソッドの定義を見てみましょう.
/**
* Register a custom driver creator Closure.
*
* @param string $driver
* @param Closure $callback
* @return \Illuminate\Support\Manager|static
*/
public function extend($driver, Closure $callback){}
このメソッドでは、2つのパラメータが受信されます.1つ目は、カスタム駆動名を表す文字列です.2つ目は、カスタム駆動を呼び出すときに実行するメソッドです.IlluminateCacheCacheManagerのソースコードを読むと、ドライバを作成する関数がIlluminateCacheRepositoryの例:IlluminateCacheRepositoryのコンストラクション関数は次のとおりです.
/**
* Create a new cache repository instance.
*
* @param \Illuminate\Cache\StoreInterface $store
*/
public function __construct(StoreInterface $store)
{
$this->store = $store;
}
IlluminateCacheStoreInterfaceインタフェースを実装するオブジェクトが必要です.このインタフェースにはCacheオブジェクトが実行できる方法が定義されています.既存のMemcachedキャッシュドライバを拡張する計画なので、IlluminateCacheCacheManagerのソースコードでは、LaravelがMemcachedドライバをこのように作成していることがわかります.
/**
* Create an instance of the Memcached cache driver.
*
* @return \Illuminate\Cache\MemcachedStore
*/
protected function createMemcachedDriver()
{
$servers = $this->app['config']['cache.memcached'];
$memcached = $this->app['memcached.connector']->connect($servers);
return $this->repository(new MemcachedStore($memcached, $this->getPrefix()));
}
まず、プロファイルから定義したMemcachedサーバを読み込み、Memcachedオブジェクトを作成します(IlluminateCacheMemcachedConnectorによって実装され、実際には標準のMemcachedオブジェクトを作成し、MemcachedのaddServerメソッドを呼び出して接続するサーバを指定し、インスタンス化されたMemcachedオブジェクトを返します).
独自のキャッシュ駆動を拡張
上記の背景知識を理解したら、自分のキャッシュ駆動を拡張することができます.考え方は以下の通りです.
1.app/config/cache.phpファイルに、「sasl認証を使用するかどうか」、「sasl認証アカウント」、「sasl認証パスワード」を設定する3つの構成項目を追加します.2.bootstrap/start.phpファイルでCache::extendメソッド拡張ドライバを呼び出します.3.app/config/cache.phpファイルでdriver構成項目を変更し、システムが独自に拡張されたドライバを使用することを指定します.
構成アイテムの追加
まず、app/config/cache.phpファイルを開き、次のものを見つけます.
'memcached' => array(
array('host' => '127.0.0.1', 'port' => 11211, 'weight' => 100),
),
次のように変更します.
'memcached' => array(
array('host' => '127.0.0.1', 'port' => 11211, 'weight' => 100),
),
'memcached_sasl' => 'true', // sasl
'memcached_user' => 'your ocs username', // OCS
'memcached_pass' => 'your ocs password', // OCS
拡張ドライブ
次にbootstrap/start.phpファイルを開き、最後の行return$app;前にコードを挿入します.
// Memcached , saslMemcached
Cache::extend('saslMemcached', function($app){
// Memcached
$servers = $app['config']['cache.memcached'];
// Illuminate\Cache\MemcachedConnector Memcached
$memcached = $app['memcached.connector']->connect($servers);
// PHP Memcached SASL
if(ini_get('memcached.use_sasl')){
// sasl
$user = $app['config']['cache.memcached_user'];
// sasl
$pass = $app['config']['cache.memcached_pass'];
// Memcached ( ……)
$memcached->setOption(Memcached::OPT_COMPRESSION, false);
// Memcached binary protocol ( sasl )
$memcached->setOption(Memcached::OPT_BINARY_PROTOCOL, true);
// sasl
$memcached->setSaslAuthData($user, $pass);
}
//
$prefix = $app['config']['cache.prefix'];
// MemcachedStore
$store = new \Illuminate\Cache\MemcachedStore($memcached, $prefix);
// Repository ,
return new \Illuminate\Cache\Repository($store);
});
構成を変更し、独自の拡張キャッシュドライバを使用
app/config/cache.phpファイルを開き、次のものを見つけます.
"driver" => "file", //
次のように変更します.
"driver" => "saslMemcached", //
これで、あなたのアリクラウドECSサーバーで、LaravelにアリクラウドOCSキャッシュサービスを使用させることができます.(PHPがMemcached拡張をサポートし、SASL認証を有効にすることを前提としています.参考:http://help.aliyun.com/doc/view/13553932.html