ホームページ  >  記事  >  PHPフレームワーク  >  ThinkPHP キャッシュ ソース コードの詳細な分析

ThinkPHP キャッシュ ソース コードの詳細な分析

咔咔
咔咔オリジナル
2021-01-18 22:46:261859ブラウズ
"

キャッシュは、プロジェクトが一定期間実行された後に使用される関数です。この記事では、フレームワーク

"

序文

キャッシュはプロジェクトの重要な機能です, ユーザーボリュームが大きい場合、キャッシュする必要があるため、データベースを直接確認すると、ユーザーエクスペリエンスが非常に悪くなります。

では、どのような状況でキャッシュを使用する必要があるのでしょうか?

  • Weibo のホット検索などの注目のイベント
  • 構成アイテムなどの頻繁に更新されないデータ
  • ブログプラットフォームのランキングリスト
  • ##ソーシャルプラットフォームのウォッチリスト、ファンリストなど
  • ##上記のアプリケーションシナリオはそうではないと言われていますフレームワークのキャッシュは通常、キャッシュ レベルでは使用されないこと。

一般的に使用されるのは、redis、memcache、その他の NoSQL です。

しかし、今日の主な議論はフレームワークでのキャッシュです。そのため、フレームワークのキャッシュが万能であるとは考えないでください。それはやはりプロジェクトの実際の状況に依存します。

まず、以下を実装する必要があります。ケースとキャッシュ クラスの導入

ThinkPHP キャッシュ ソース コードの詳細な分析
デモ ケース

キャッシュはどのように実行されますか?

コードだけですCache::setこれがどのように機能するか知っていますか?カカを知らないなら、私が詳しく教えてあげるよ。

フレームワークのエントリ ファイルがindex.phpであり、base.phpという名前のファイルがエントリ ファイルに導入されていることは誰もが知っています。

ThinkPHP キャッシュ ソース コードの詳細な分析
エントリーファイル

base.phpファイルに行くと、登録されているクラスライブラリのエイリアスが表示されますので、登録方法としては、これを実行します。フレームワーク内 プロセスに関するセクションに詳細な説明があり、戻って詳細を学ぶことができます。

ThinkPHP キャッシュ ソース コードの詳細な分析
クラス ライブラリのエイリアスを登録します

したがって、コードはフレームワークのコアにあるファサード クラスで実行されます。このクラスにはメソッド __callStatic があります。このメソッドは、存在しない静的メソッドが呼び出されたときに実行されます。

ThinkPHP キャッシュ ソース コードの詳細な分析
ファサードのコア クラス

それでは、この検証を行う方法を説明します。これだけは言えないですよ、そうなんですよね?

次に、コードは Facade インスタンスを作成するメソッドに進みます。テストでは、このクラスの値を出力します。

ThinkPHP キャッシュ ソース コードの詳細な分析
Facade インスタンスの作成

このキャッシュが何回実行されたかに関係なく、印刷結果にこの値が存在することがはっきりとわかります。さまざまな面でカカのレトリックが証明された。

ThinkPHP キャッシュ ソース コードの詳細な分析#印刷されたテスト値
#ここには、誰もが知っておくべき非常に小さな詳細があると思います。それは、静的関数の使用についてです

静的に関するヒント

#まず、キャッシュ クラスが Facade ファサード クラス

# を継承していることがわかります。 #その後、静的がファサード クラスで使用され、最終的に返されるクラスは、ファサード クラスを継承するクラス、つまりキャッシュ クラスですThinkPHP キャッシュ ソース コードの詳細な分析
ファサード クラスのデモ

これを 1 つの文で要約すると次のようになります。ThinkPHP キャッシュ ソース コードの詳細な分析
static 継承された場合はデフォルトでサブクラスが呼び出され、そうでない場合はそれ自体を呼び出します

それでは、次のようにしましょう。続行

static::getFacadeClass()ここにも、実行されるサブクラスのメソッドがあります。

さて、ちょっとした幕間に入り、本題に入ります。

したがって、コードはコア クラス ライブラリの場所であるファイル thinkphp/library/think/Cache.php に対して実行されます。

このメソッドには set メソッドが見つからないため、コードは __call メソッドに対して実行され、存在しないメソッドが呼び出されたときにトリガーされます。

ThinkPHP キャッシュ ソース コードの詳細な分析#キャッシュ クラス

キャッシュの自動初期化

実行プロセスに従って、init メソッドが表示されます。キャッシュを自動的に初期化します (初回はここでは実行されず、make メソッドが実行されることに注意してください。make メソッドが実行されると、値はハンドラー属性に格納されます。2 回目は呼び出しを通じて取得されます)メソッドを実行すると、直接返されます。一度実行するのではなく、ここで注意する必要があります)

ThinkPHP キャッシュ ソース コードの詳細な分析キャッシュを自動的に初期化します
ここでは一度だけ出力します

$options これの値。

ThinkPHP キャッシュ ソース コードの詳細な分析結果を出力する

$options パラメーターに値がある理由について説明します

これはコンテナーの知識に関するものです、カカに来て見せてください。

ThinkPHP キャッシュ ソース コードの詳細な分析
makeメソッド

Cacheを作成する際にFacadeインスタンスを作成しますが、その際に下図の丸で囲った部分に注目してThis isを実行してください。 makeメソッド。

ThinkPHP キャッシュ ソース コードの詳細な分析#Facade インスタンスの作成
make メソッドに到達したら、丸で囲まれた領域に注目してください

ThinkPHP キャッシュ ソース コードの詳細な分析第二次执行的位置 make メソッドが 2 回目に実行される場所
次に、

invokeClass メソッドを入力します。このメソッドは、依存関係の注入をサポートするためにリフレクション実行クラスのインスタンス化を呼び出します。

このメソッドでは、Cache の make メソッドがリフレクションを通じて実行されます。

调用反射执行类的实例化 支持依赖注入依存性注入をサポートするためにリフレクション実行クラスのインスタンス化を呼び出します
したがって、Cache クラスの make メソッドが実行され、このメソッドがインスタンス化されます。このクラスを作成してコンストラクターを実行します。次に見てみましょう。

缓存类的ThinkPHP キャッシュ ソース コードの詳細な分析
キャッシュクラスのmakeメソッド

コンストラクタに到達すると、makeメソッドから取得したキャッシュ設定ファイルの設定項目が以下のようになっていることがわかります。 init メソッドに渡される、キャッシュを自動的に初期化する部分です。

ThinkPHP キャッシュ ソース コードの詳細な分析
Constructor

ここから、init メソッドがキャッシュを自動的に初期化することがわかります。最初の実行は、コンテナーがインスタンス化されるときに実行されます。 ## $options には値が入ります。

次に、このプロセスに従って接続キャッシュを実行します。これはコード

$this->handler = $this->connect($options); の内容です。

この方法は非常に簡単で、前に説明したファクトリー モードを使用してさまざまな種類のキャッシュをロードします。

その後、返されたオブジェクトは、添え字として

$optionsmd5 を付けてキャッシュ インスタンス属性 $instance に保存されます。

ThinkPHP キャッシュ ソース コードの詳細な分析
接続キャッシュ

最終コードはキャッシュ内の __call メソッドに返されます。クラスは object(think\cache\driver\File)# です。 ## メソッドは set

ThinkPHP キャッシュ ソース コードの詳細な分析 存在しないメソッドが呼び出された場合、そのメソッドが実行されます
その後、実行されますプロセスは以下の場所に来て Cache を書き込みます

ThinkPHP キャッシュ ソース コードの詳細な分析キャッシュを書き込みます

ファイル名を取得します

この方法で理解する必要がある主な点は、キャッシュ内の特定のファイル名を取得してデータを保存する方法です。

この名前の値は、wechat で設定する必要がある値です。

ThinkPHP キャッシュ ソース コードの詳細な分析変数のストレージ ファイル名を取得する
次に、getCacheKey に移動して、変数のストレージ ファイル名を取得します。

このメソッドの最初のステップは、ハッシュを通じて型とキャッシュ値を暗号化することです。これらのオプションはこのクラスで宣言されているため、ここで明確にする必要があります。

オプション変数はフレームワークで広範囲に使用されるため、混同しないでください。

この方法で理解する必要があるのは、ファイル名がどのように決定されるかということです。

ThinkPHP キャッシュ ソース コードの詳細な分析
ファイル名の取得

このオプションの値を確認するには、このクラスの先頭に移動する必要があります。このクラスでは次のことがわかります。上の図 使用される暗号化タイプは hash_type で、これは md5です。

ThinkPHP キャッシュ ソース コードの詳細な分析
ファイルにキャッシュされた値について

次に、コンストラクターに移動すると、パスの設定

ThinkPHP キャッシュ ソース コードの詳細な分析
キャッシュ ファイルのパスを取得します
#コード行

Container::get('app' を確認できます) ) 上の図では、このコード行はコンテナを使用して make メソッドを実行しています。make メソッドはコンテナ内で非常に重要な役割を果たすため、注意深く理解する必要があります。

次に、見たことがあるかどうかわからない小さな詳細があります。つまり、以下に init メソッドがあります。このメソッドが何をするのか見てみましょう。

この方法にたどり着くと、取得したキャッシュ ファイルのパスに従ってファイルが直接作成されていることがわかります。

ThinkPHP キャッシュ ソース コードの詳細な分析
初期化チェック

このとき、作成されたファイルを確認すると、ファイルが作成されていることがわかります。

ThinkPHP キャッシュ ソース コードの詳細な分析#キャッシュ ファイルのパス
#最後に、file_put_contents 関数を使用して、先ほど取得したキャッシュ ファイルの保存場所にデータを保存します

キャッシュファイルへのデータの書き込みThinkPHP キャッシュ ソース コードの詳細な分析
データベースの格納形式は以下のとおりです

#データの格納形式
ThinkPHP キャッシュ ソース コードの詳細な分析
ここまででフレームワークのキャッシュ設定は終わりですが、実はこのプロセスは難しくありません、この場合、Kaka が使用するファイル形式は Redis などと同じです。

2. キャッシュ取得とソースコード解析の実行手順ソースコードを学習しました。キャッシュ設定の分析 次に、キャッシュによって得られるソースコード分析についても簡単に理解する必要があります。

同じデモ ケースは前と同じです。set を get

に置き換えるだけです。

ThinkPHP キャッシュ ソース コードの詳細な分析
デモ ケース

プロセスはキャッシュのセットアップと同じです。まず、ファサード クラスに移動して、キャッシュの対応するインスタンスを作成します

ThinkPHP キャッシュ ソース コードの詳細な分析
ファサード クラスはキャッシュ インスタンスを作成します

ファサード クラスがキャッシュ クラスを作成すると、キャッシュ クラス ファイルが作成されますthinkphp/library/ think/Cache.php

このファイルでは、存在しないメソッドを呼び出して実行する __call メソッドがまだ使用されていることがわかります。

ThinkPHP キャッシュ ソース コードの詳細な分析
キャッシュされたファイル

次に、init メソッドに進みます。このメソッドは、キャッシュ値を設定するときに詳しく説明されています。

実行プロセスによると、init メソッドが自動的にキャッシュを初期化することがわかります (最初に実行されるのはここではなく make メソッドであることに注意してください。make メソッドが実行されると、値はハンドラの属性に格納され、2 回目の call メソッドを介して入力するとすぐに戻り、再度実行されることはありません。ここに注意する必要があります)

なぜキャッシュのmakeメソッドが最初に実行される? これは、コンテナ内にキャッシュクラスのインスタンスを作成する際に、クラス内にmakeメソッドが存在するかどうかをmakeメソッド内で判定し、存在する場合はそれを先に実行するためです。

ThinkPHP キャッシュ ソース コードの詳細な分析
キャッシュを自動的に初期化します

したがって、キャッシュ クラスでreturn call_user_func_array([$this->init(), $method], $args ) ;このコードは、thinkphp/library/think/cache/driver/File.phpこのクラスのメソッドを取得します

ThinkPHP キャッシュ ソース コードの詳細な分析
キャッシュの読み取り

このクラスでは、キャッシュ値を設定する際に解析に時間がかかるメソッドが確認できます。 getCacheKey

このメソッドでは、主に sbustr が使用されます。値のスタンザを暗号化します。最初の 2 つの値はディレクトリ、残りの文字はファイル名です。

次に、ファイル名を返します。

ThinkPHP キャッシュ ソース コードの詳細な分析
変数のストレージ ファイル名を取得します

次に、file_get_contents を使用してファイルの内容を取得します

ThinkPHP キャッシュ ソース コードの詳細な分析
ファイルの内容を読んでください

その後、引き続き下を見てください。ここには期限切れの削除されたキャッシュ ファイルがあります。

フレームワークの有効期限ポリシーでは、有効期限を設定すると、キャッシュは期限切れ直後に削除されず、再度アクセスした後に削除されます。

この戦略は、redis での遅延削除です。遅延削除を使用すると、データは有効期限が切れても自動的に削除されません。その場合、その削除方法は、次回キー値が取得されたときに、Make aキーの有効期限が切れているかどうかを判断し、有効期限が切れている場合は削除します。

ThinkPHP キャッシュ ソース コードの詳細な分析
期限切れのモミ ツリー キャッシュ ファイル

ここまでで、ソース コード解析によってキャッシュ取得の実行処理が完了しました。コンテンツは分析されたときに取得されます。

それでは、なぜキャッシュされたデータの取得について話す必要があるのでしょうか? それは、ここで説明する必要があるからです。

3. データ圧縮

キャッシュの設定時に、キャッシュされた値を書き込むときに問題が発生しました。 Functiongzcompress

しかし、キャッシュ値を取得してファイルからデータを読み取るときに、関数gzuncompress

に遭遇しました。実は設​​定から​​ キャッシュとキャッシュ取得の2つの機能から、圧縮データが設定され、伸長データが取得されていることが分かります。

PHP には他に 2 つの圧縮関数があります: gzdeflate と gzencode。同じ解凍関数は gzinflate gzdecode

にも対応します。関数はすべて圧縮ですが、関数の場合、基礎となる実装が異なります。

gzcompress は ZLIB 形式を使用します;

gzdeflate は純粋な DEFLATE 形式を使用します;

gzencode は GZIP 形式を使用します;

上記は、一部を理解するだけです。データの圧縮と解凍に関する知識。

4. 概要

このセクションでは、Kaka がフレームワークのキャッシュ処理結果について説明します。

実際、Kaka は以前、フレームワークに付属するキャッシュ応答時間が 3 分の 1 に短縮されることをテストしました。もちろん、これはデータ量によっても異なります。

PHP フレームワーク ThinkPHP のソース コード解釈はここまでです。後で時間があれば、まだ解釈されていない内容の一部を解釈します。言及された。

最後に、ソースコードを読むのは本当に疲れます。

学習の継続、ブログの継続、共有の継続は、キャリア以来、カカが常に支持してきた信念です。Nuoda Internet でのカカの記事が何かをもたらすことを願っています」助けてください。私はカカです。また次回お会いしましょう。

以上がThinkPHP キャッシュ ソース コードの詳細な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。