この記事では、Alibaba Cloud OCS キャッシュを使用して実装される Laravel の拡張 Memcached キャッシュ ドライバーを主に紹介します。この記事では、SASL 認証をサポートする Memcached キャッシュ ドライバーを拡張します。友達が参照できることが必要なモードです
Laravel は私が最近よく使っている PHP フレームワークで、使えば使うほど気に入っています。下位互換性の歴史的な荷物がないため、完全にオブジェクト指向であり、Facades のエレガントな IoC Container 実装を使用しています。オープンソースコミュニティの優れたコンポーネントを簡単に導入して利用することができます。つまり、これはまさに「楽しくコーディングできる」「マスターレベルのPHP開発フレームワーク」です。
Laravel アプリを Alibaba Cloud にデプロイしようとしたときに、問題が発生しました。Laravel は Memcached キャッシュをサポートしており、Alibaba Cloud の OCS も Memcached キャッシュに基づいていますが、Alibaba Cloud OCS は SASL 認証を使用し、Laravel の Memcached ドライバーは使用しません。関連メソッドを実装する場合、サーバー上で PHP Memcached をコンパイルするときに SASL 認証オプションが有効になっている場合でも、ユーザー名とパスワードを設定する方法はありません。
Laravelではこの問題を解決する方法がたくさんあります。私は最も速くて最もトラブルのない方法を選択しました。それは、Laravel 独自の Memcached ドライバーを拡張し、Memcached オブジェクト自体の setSaslAuthData メソッドを通じてユーザー名とパスワードを指定することです。
背景知識
これは、IlluminateCacheCacheManager(IlluminateSupportManagerから継承)のextendメソッドを使用しています。まずこのメソッドの定義を見てみましょう:
コードは次のとおりです:
/**
* カスタムドライバー作成者を登録します。
** @param string $driver
* @param Closure $callback
* @return IlluminateSupportManager|static
*/
パブリック関数 extend($driver, Closure $callback){}
このメソッドは 2 つのパラメータを受け取ります。1 つ目はカスタム ドライバ名を表す文字列で、2 つ目はクロージャ コールバック関数です。この関数は、カスタム ドライバが呼び出されたときに実行されるメソッドです。 IlluminateCacheCacheManager のソース コードを読むと、ドライバーを作成する関数が IlluminateCacheRepository のインスタンスを返すことがわかります。IlluminateCacheRepository のコンストラクターは次のとおりです。
コードをコピーします。コードは次のとおりです:
/**
* 新しいキャッシュ リポジトリ インスタンスを作成します。
*
* @param IlluminateCacheStoreInterface $store
*/
パブリック関数 __construct(StoreInterface $store)
{
$this->store = $store;
}
Cache オブジェクトが実行できるメソッドを定義する IlluminateCacheStoreInterface インターフェイスを実装するオブジェクトが必要です。私の計画は元の Memcached キャッシュ ドライバーを拡張することなので、IlluminateCacheCacheManager のソース コードでは、Laravel が次のように Memcached ドライバーを作成することがわかります。
コードは次のとおりです:/**
* Memcached キャッシュ ドライバーのインスタンスを作成します。
*
* @return IlluminateCacheMemcachedStore
*/
保護された関数 createMemcachedDriver()
{
$servers = $this->app['config']['cache.memcached'];
$memcached = $this->app['memcached.connector']->connect($servers);
$this->repository(new MemcachedStore($memcached, $this->getPrefix()));
を返す
}最初に設定ファイルから定義した Memcached サーバーを読み取り、次に Memcached オブジェクトを作成します (IlluminateCacheMemcachedConnector によって実装され、実際には標準の Memcached オブジェクトを作成します)。その後、Memcached の addServer メソッドを呼び出して接続先のサーバーを指定し、その後 Instantiated を返します。 Memcached オブジェクト )
独自のキャッシュドライバーを拡張する
上記の背景知識を理解した後、独自のキャッシュ ドライバーを拡張できます。アイデアは次のとおりです:
1. app/config/cache.php ファイルに、「sasl認証を使用するかどうか」、「sasl認証アカウント」、「sasl認証パスワード」を設定する3つの設定項目を追加します。
2. bootstrap/start.php ファイルで、Cache::extend メソッドを呼び出してドライバーを拡張します。
3. app/config/cache.php ファイルで、ドライバー構成項目を変更し、システムが独自の拡張ドライバーを使用するように指定します。
設定項目を追加します
まず、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'];
// IlluminateCacheMemcachedConnector クラスを使用して、新しい 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 圧縮を無効にする (これは Alibaba Cloud のドキュメントで行われます...)
$memcached->setOption(Memcached::OPT_COMPRESSION, false);
//バイナリプロトコルを使用するように Memcached を指定します (sasl 認証要件)
$memcached->setOption(Memcached::OPT_BINARY_PROTOCOL, true);
//sasl認証に使用するアカウントのパスワードを指定します
$memcached->setSaslAuthData($user, $pass);
}
// 設定ファイルからキャッシュプレフィックスを読み取ります
$prefix = $app['config']['cache.prefix'];
// MemcachedStore オブジェクトを作成します
$store = new IlluminateCacheMemcachedStore($memcached, $prefix);
// Repository オブジェクトを作成して返す
新しい IlluminateCacheRepository($store) を返します;
});
設定を変更し、独自の拡張キャッシュドライバーを使用します
app/config/cache.php ファイルを開いて、以下を見つけます:
コードは次のとおりです:
"driver" => "file", // デフォルトではファイルキャッシュを使用します
変更後の内容:
コードは次のとおりです:
"driver" => "saslMemcached", // 展開して実装しただけのドライバー名です
これで、Laravel に Alibaba Cloud ECS サーバー上の Alibaba Cloud OCS キャッシュ サービスを使用させることができます。 (