Laravelフレームでアリ雲ACEキャッシュサービスを実現します.

7774 ワード

前にLaravel 4の枠組みの中でアリ雲OCSキャッシュを使用した文章を書きましたが、どのようにLaravel 4を拡張することによってSASL認証が必要なアリ雲OCSキャッシュサービスをサポートするかを紹介しました.ACEのキャッシュはどのようにLaravel 4で使えばいいですか?同じ方法を使うべきだと思っていましたが、自分で試してみたところ、ACEのキャッシュの差が大きいことに気づきました.そこでもう一つ書きます.Laravelの枠組みの中でアリ雲ACEを使うキャッシュサービスを紹介します.
どのようにLaravelのキャッシュドライバを拡張しますか?
Laravel 4でCache:get($key)、Cache:put($value、$minutes)というコードを使用すると、実際に実際に実際にIlluminate\Cache\Repositoryにアクセスしますので、Cache:exted方法でカスタムキャッシュドライブを拡張する場合も、同じようにIllumemitoryオブジェクトに戻ります.
Laravel 4内蔵のMemcachedキャッシュ駆動で実現される流れはこうです.
1.標準Memcached類の新しいオブジェクトを作成する2.前のステップで作成したMemcachedオブジェクトでIlluminate\Cache\StreInterfaceインターフェースを実現したIlluminate\Cache\MemecachedStoreオブジェクトを作成します.3.前のステップで作成したMemcachedStoreオブジェクトでIlluminate\Cache\Repositoryオブジェクトを作成します.
だから、私たちはカスタムのCacheドライバを拡張する時、自分の状況によって、上のステップを選択してカスタマイズします.最終的にはIlluminate\Cache\Repositoryオブジェクトに戻ります.前の記事では、私は最初のステップで標準的なMemcachedオブジェクトを作成した後、set SaslathData()方法でOCSに必要なユーザ名パスワードを設定します.その後、第2ステップ、第3ステップはカスタムが必要ではありません.
ACEのキャッシュサービス
アリークラウドACEのキャッシュサービスは、デフォルトのOCSとは異なります.
1.Alibababababa:Cache()方法でCacheの対象を獲得します.2.ACEのCacheオブジェクトは標準Memcachedオブジェクトとは異なり、サポートの方法は限られています.
ですから、今回の第一歩は標準Memcachedオブジェクトではないので、Illuminate\Cache\MemcachedStoreオブジェクトを作成できません.自分でIlluminate\Cache\StreInterfaceインターフェースを実現する必要があります.
コンソールがキャッシュ空間を作成したら、唯一の「キャッシュ空間名」があります.そしてAlibaba:Cache('キャッシュ空間名')を通じてCacheオブジェクトを獲得します.以下はACEキャッシュサービス駆動を実現するステップです.
1.変更を容易にするために、設定ファイルのap/config/cache.phpにaceというキーを追加し、キャッシュ空間名を保存します.2.AceMemcachedStoreクラスを作成し、このクラスはIlluminate\Cache\StreInterfaceインターフェースを実現します.3.最後に、AceMemcachedStoreオブジェクトでIlluminate\Cache\Repositoryオブジェクトを作成します.
具体的なコードの実現を見てみます.
エンコードはカスタムACEキャッシュドライバを実現します.
最初のステップで、プロファイルを変更します.アプリ/config/cache.phpを開いて、最後の行を追加します.
 
  
//
'ace' => 'lblog-cache',
第二のステップは、簡単にするために、自分のクラスのファイルをsrc/Aceディレクトリの下に置いて、Aceを名前空間として使います.
1.appの同級ディレクトリにディレクトリsrc/Aceを作成します.2.compser.jsonファイルを開けて、autloadセクションを修正し、classmapの下でpsp-0またはpsp-4を使って自動的にファイルをロードします.
 
  
"autoload": {
    "classmap": [
        // autoload class
    ],
    "psr-4": {
      "Ace\\": "src/Ace"
    }
},
src/Ace/AceMemcachedStore.phpファイルを作成します.コードは以下の通りです.
 
  
 
namespace Ace;
use Illuminate\Cache\StoreInterface;
use Illuminate\Cache\TaggableStore;
 
class AceMemcachedStore extends TaggableStore implements StoreInterface {
 
    protected $memcached;
    protected $prefix;
 
    public function __construct($space, $prefix = '') {
        $this->memcached = \Alibaba::Cache($space);
        $this->prefix = strlen($prefix) > 0 ? $prefix.':' : '';
    }
 
    /**
     * Retrieve an item from the cache by key.
     *
     * @param  string $key
     * @return mixed
     */
    public function get($key)
    {
        $value = $this->memcached->get($this->prefix.$key);
        if(is_bool($value) && $value === false) {
            return null;
        }
        return $value;
    }
 
    /**
     * Store an item in the cache for a given number of minutes.
     *
     * @param  string $key
     * @param  mixed $value
     * @param  int $minutes
     * @return boolean
     */
    public function put($key, $value, $minutes)
    {
        return $this->memcached->set($this->prefix.$key, $value, $minutes);
    }
 
    /**
     * Increment the value of an item in the cache.
     *
     * @param  string $key
     * @param  mixed $value
     * @return boolean
     */
    public function increment($key, $value = 1)
    {
        return $this->memcached->increment($this->prefix.$key, $value);
    }
 
    /**
     * Decrement the value of an item in the cache.
     *
     * @param  string $key
     * @param  mixed $value
     * @return boolean
     */
    public function decrement($key, $value = 1)
    {
        return $this->memcached->decrement($this->prefix.$key, $value);
    }
 
    /**
     * Store an item in the cache indefinitely.
     *
     * @param  string $key
     * @param  mixed $value
     * @return boolean
     */
    public function forever($key, $value)
    {
        return $this->memcached->set($key, $value, 0);
    }
 
    /**
     * Remove an item from the cache.
     *
     * @param  string $key
     * @return boolean
     */
    public function forget($key)
    {
        return $this->memcached->delete($this->prefix.$key);
    }
 
    /**
     * Remove all items from the cache.
     *
     * @return void
     */
    public function flush()
    {
        //$this->memcached->flush();
        return false;
    }
 
    public function getMemcached()
    {
        return $this->memcached;
    }
    /**
     * Get the cache key prefix.
     *
     * @return string
     */
    public function getPrefix()
    {
        return $this->prefix;
    }
}
このコードは簡単ですが、get($key)方法の実現には特に注意してください.標準的なmemcachedおよびACEのキャッシュオブジェクトのget方法は、keyが有効である場合には対応するキャッシュ値を返します.そうでなければfalseに戻り、Laravel 4では、get方法で戻ったnullを検出することによって判断するので、ここでは処理が必要です.キャッシュ値またはnullに戻ります.
AceMemcachedStore類はすでに作成されました.次にbootstrap/start.phpファイルにCacheを拡張します.
bootstrap/start.phpを開いて、以下のコードを追加します.
 
  
// ace
Cache::extend('ace', function($app)
{
    // app/config/cache.php "ace"
    $space = $app['config']['cache.ace'];
    
    // app/config/cache.php "prefix"
    $prefix = $app['config']['cache.prefix'];
    
    // \Ace\AceMemcachedStore
    $store = new \Ace\AceMemcachedStore($space, $prefix);
    
    // \Illuminate\Cache\Repository
    return new \Illuminate\Cache\Repository($store);
 
});
指定されたシステムはキャッシュドライバとして「ace」を使います.ap/config/cache.phpを開いて、「driver'=''''ace'を見つけます.
使用と制限
以上の操作により、Laravel 4でACEのキャッシュサービスを呼び出すことができます.
 
  
// , 10
Cache::put('my_key', 'my value', 10);
 
//
Cache::get('my_key')
 
//
Cache::has('my_key')
 
//
$users = DB::table('users')->remember(10)->get();
ただし、ACEキャッシュオブジェクト自体の制限のため、指定されたkeyのキャッシュオブジェクトのみが削除され、巡回、フルボリュームで操作できないので、Cache:flush()メソッドは使用できません.上記のAceMemcachedStoreオブジェクトでは、flushメソッドは何の操作もしていません.falseに戻ります.