Yacとは
名前からもわかるように、これも巨匠Niao Geの作品です。結局のところ、彼は PHP の中心的な開発者であり、彼の仕事は常に私たちを失望させません。ニャオ兄弟は中国人プログラマーの誇りとも言えます。彼は PHP の世界で決定的な役割を果たしています。彼のブログは自分で検索できます。更新頻度は高くありませんが、どの記事も学ぶ価値があります。
Yac は、ロックフリーの共有キャッシュ システムであり、ロックフリーであるため、非常に効率的です。 Apc は Memcached の 2 倍以上の効率があると言われていますが、Yac は Apc よりも高速です。これが最大の特徴です。
Memcached や Redis と比較すると、Yac は軽量です。サーバーに他のソフトウェアをインストールする必要はありません。この拡張機能をインストールするだけで使用できます。小規模なシステム、特にデータをキャッシュするだけのシステムの場合、複雑なデータ型は必要なく、この拡張プログラミング言語を使用するだけで開発がより便利かつ迅速になります。
インストール方法も非常に簡単で、PECLからインストールパッケージをダウンロードして拡張機能をインストールするだけです。
基本操作
キャッシュ関連の操作は、キャッシュの追加、変更、削除にすぎません。外部キャッシュ システムとは異なり、配列やオブジェクトを保存する場合、PHP 拡張クラスのキャッシュでは、文字列にシリアル化したり、JSON 文字列に変換したりせずに、これらのデータ型を直接保存できます。これは、Apc と Yac の利点の 1 つです。
キャッシュの追加と取得
$yac = new Yac(); $yac->add('a', 'value a'); $yac->add('b', [1,2,3,4]); $obj = new stdClass; $obj->v = 'obj v'; $yac->add('obj', $obj); echo $yac->get('a'), PHP_EOL; // value a echo $yac->a, PHP_EOL; // value a print_r($yac->get('b')); // Array // ( // [0] => 1 // [1] => 2 // [2] => 3 // [3] => 4 // ) var_dump($yac->get('obj')); // object(stdClass)#3 (1) { // ["v"]=> // string(5) "obj v" // }
非常に簡単な操作です。Yac クラスをインスタンス化するだけで、add() メソッドと get() メソッドを通じてキャッシュ コンテンツを追加および取得できます。 。
Yac 拡張機能は __set() および __get() マジック メソッドもオーバーライドするため、変数を操作することでキャッシュを直接操作できます。
次に、info() 関数を使用して、現在のキャッシュされたステータス情報を表示できます。
print_r($yac->info()); // Array // ( // [memory_size] => 71303168 // [slots_memory_size] => 4194304 // [values_memory_size] => 67108864 // [segment_size] => 4194304 // [segment_num] => 16 // [miss] => 0 // [hits] => 4 // [fails] => 0 // [kicks] => 0 // [recycles] => 0 // [slots_size] => 32768 // [slots_used] => 3 // )
キャッシュの設定
$yac->set('a', 'new value a!'); echo $yac->a, PHP_EOL; // new value a! $yac->a = 'best new value a!'; echo $yac->a, PHP_EOL; // best new value a!
set() 関数の機能は、現在のキャッシュ キーが存在する場合にキャッシュの内容を変更することです。存在しない場合は、キャッシュを作成します。
キャッシュの削除
$yac->delete('a'); echo $yac->a, PHP_EOL; // $yac->flush(); print_r($yac->info()); // Array // ( // [memory_size] => 71303168 // [slots_memory_size] => 4194304 // [values_memory_size] => 67108864 // [segment_size] => 4194304 // [segment_num] => 16 // [miss] => 1 // [hits] => 6 // [fails] => 0 // [kicks] => 0 // [recycles] => 0 // [slots_size] => 32768 // [slots_used] => 0 // )
単一のキャッシュを削除する場合、delete() 関数を直接使用して、このキャッシュの内容を削除できます。キャッシュ スペース全体をクリアしたい場合は、flush() を直接使用してキャッシュ スペース全体をクリアできます。
エイリアス スペース
キャッシュ スペースについては上で説明しました。実際、Yac をインスタンス化するときに、デフォルトの Yac クラス コンストラクターにエイリアス設定を渡すことができます。このように、異なる Yac インスタンスは異なる名前空間に配置されることと同等であり、異なる空間にある同じキーのキャッシュは相互に影響しません。
$yacFirst = new Yac(); $yacFirst->a = 'first a!';; $yacSecond = new Yac(); $yacSecond->a = 'second a!'; echo $yacFirst->a, PHP_EOL; // second a! echo $yacSecond->a, PHP_EOL; // second a!
このコードでは、デフォルトでインスタンス化された Yac オブジェクトを使用しています。これらは個別にインスタンス化されていますが、保存されるスペースは同じなので、同じ変数は互いに上書きされます。
$yacFirst = new Yac('first'); $yacFirst->a = 'first a!';; $yacSecond = new Yac('second'); $yacSecond->a = 'second a!'; echo $yacFirst->a, PHP_EOL; // first a! echo $yacSecond->a, PHP_EOL; // second a!
異なるインスタンス化パラメータを使用する場合、同じパラメータは相互に影響を与えず、異なる空間に保存されます。つまり、Yac はこれらのキーにプレフィックスを自動的に追加します。
キャッシュのエージング
最後に、キャッシュ システムにはキャッシュされたコンテンツに対するエージング制限があり、有効期限が指定されている場合、キャッシュされたコンテンツは指定された時間が経過すると期限切れになります。
$yac->add('ttl', '10s', 10); $yac->set('ttl2', '20s', 20); echo $yac->get('ttl'), PHP_EOL; // 10s echo $yac->ttl2, PHP_EOL; // 20s sleep(10); echo $yac->get('ttl'), PHP_EOL; // echo $yac->ttl2, PHP_EOL; // 20s
上記のコードの ttl キャッシュは有効期限を 10 秒のみに設定しているため、10 秒間の sleep() の後、出力 ttl には内容がありません。
時間設定をしないと有効期限が長くなり、__set()メソッドで有効期限を設定することはできないので注意してください。または add() 関数を使用して有効期限を設定します。
概要
Yac 拡張機能はどうですか? Apc と同じくらい便利で使いやすいですか? もちろん、より重要なのはそのパフォーマンスと適用可能なシナリオです。 。小規模システム、特にマシン構成がそれほど強力ではないオペレーティング環境では、この拡張キャッシュ システムにより開発がより迅速かつ便利になります。ロックフリー共有の概念については、以下の参考文書の 2 番目のリンクを参照してください。これについては、Niao 兄弟の記事で詳しく説明されています。
テスト コード:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202006/source/PHP%E7%9A%84%E5%8F%A6%E4%B8%80%E4%B8%AA%E9%AB%98%E6%95%88%E7%BC%93%E5%AD%98%E6%89%A9%E5%B1%95%EF%BC%9AYac.php
推奨学習: php ビデオ チュートリアル