"キャッシュは、プロジェクトが一定期間実行された後に使用される関数です。この記事では、フレームワーク
"
キャッシュはプロジェクトの重要な機能です, ユーザーボリュームが大きい場合、キャッシュする必要があるため、データベースを直接確認すると、ユーザーエクスペリエンスが非常に悪くなります。
では、どのような状況でキャッシュを使用する必要があるのでしょうか?
一般的に使用されるのは、redis、memcache、その他の NoSQL です。
しかし、今日の主な議論はフレームワークでのキャッシュです。そのため、フレームワークのキャッシュが万能であるとは考えないでください。それはやはりプロジェクトの実際の状況に依存します。
キャッシュはどのように実行されますか?
コードだけですCache::set
これがどのように機能するか知っていますか?カカを知らないなら、私が詳しく教えてあげるよ。
フレームワークのエントリ ファイルがindex.phpであり、base.phpという名前のファイルがエントリ ファイルに導入されていることは誰もが知っています。
base.phpファイルに行くと、登録されているクラスライブラリのエイリアスが表示されますので、登録方法としては、これを実行します。フレームワーク内 プロセスに関するセクションに詳細な説明があり、戻って詳細を学ぶことができます。
したがって、コードはフレームワークのコアにあるファサード クラスで実行されます。このクラスにはメソッド __callStatic があります。このメソッドは、存在しない静的メソッドが呼び出されたときに実行されます。
それでは、この検証を行う方法を説明します。これだけは言えないですよ、そうなんですよね?
次に、コードは Facade インスタンスを作成するメソッドに進みます。テストでは、このクラスの値を出力します。
このキャッシュが何回実行されたかに関係なく、印刷結果にこの値が存在することがはっきりとわかります。さまざまな面でカカのレトリックが証明された。
静的に関するヒント#まず、キャッシュ クラスが Facade ファサード クラス
ファサード クラスのデモそれでは、次のようにしましょう。続行
static::getFacadeClass()ここにも、実行されるサブクラスのメソッドがあります。
さて、ちょっとした幕間に入り、本題に入ります。
したがって、コードはコア クラス ライブラリの場所であるファイル thinkphp/library/think/Cache.php
に対して実行されます。
このメソッドには set メソッドが見つからないため、コードは __call メソッドに対して実行され、存在しないメソッドが呼び出されたときにトリガーされます。
キャッシュの自動初期化
実行プロセスに従って、init メソッドが表示されます。キャッシュを自動的に初期化します (初回はここでは実行されず、make メソッドが実行されることに注意してください。make メソッドが実行されると、値はハンドラー属性に格納されます。2 回目は呼び出しを通じて取得されます)メソッドを実行すると、直接返されます。一度実行するのではなく、ここで注意する必要があります) ここでは一度だけ出力します$options これの値。
$options パラメーターに値がある理由について説明します
これはコンテナーの知識に関するものです、カカに来て見せてください。Cacheを作成する際にFacadeインスタンスを作成しますが、その際に下図の丸で囲った部分に注目してThis isを実行してください。 makeメソッド。
make メソッドに到達したら、丸で囲まれた領域に注目してください 次に、invokeClass メソッドを入力します。このメソッドは、依存関係の注入をサポートするためにリフレクション実行クラスのインスタンス化を呼び出します。
コンストラクタに到達すると、makeメソッドから取得したキャッシュ設定ファイルの設定項目が以下のようになっていることがわかります。 init メソッドに渡される、キャッシュを自動的に初期化する部分です。
ここから、init メソッドがキャッシュを自動的に初期化することがわかります。最初の実行は、コンテナーがインスタンス化されるときに実行されます。 ## $options には値が入ります。
$this->handler = $this->connect($options); の内容です。
$optionsmd5 を付けてキャッシュ インスタンス属性
$instance に保存されます。
最終コードはキャッシュ内の __call メソッドに返されます。クラスは object(think\cache\driver\File)# です。 ## メソッドは
set
ファイル名を取得します
この方法で理解する必要がある主な点は、キャッシュ内の特定のファイル名を取得してデータを保存する方法です。 この名前の値は、wechat で設定する必要がある値です。 次に、getCacheKey に移動して、変数のストレージ ファイル名を取得します。 このメソッドの最初のステップは、ハッシュを通じて型とキャッシュ値を暗号化することです。これらのオプションはこのクラスで宣言されているため、ここで明確にする必要があります。オプション変数はフレームワークで広範囲に使用されるため、混同しないでください。
この方法で理解する必要があるのは、ファイル名がどのように決定されるかということです。
このオプションの値を確認するには、このクラスの先頭に移動する必要があります。このクラスでは次のことがわかります。上の図 使用される暗号化タイプは hash_type で、これは md5です。
次に、コンストラクターに移動すると、パスの設定
#コード行Container::get('app' を確認できます) ) 上の図では、このコード行はコンテナを使用して make メソッドを実行しています。make メソッドはコンテナ内で非常に重要な役割を果たすため、注意深く理解する必要があります。
このとき、作成されたファイルを確認すると、ファイルが作成されていることがわかります。
#データの格納形式に置き換えるだけです。
プロセスはキャッシュのセットアップと同じです。まず、ファサード クラスに移動して、キャッシュの対応するインスタンスを作成します
ファサード クラスがキャッシュ クラスを作成すると、キャッシュ クラス ファイルが作成されますthinkphp/library/ think/Cache.php
このファイルでは、存在しないメソッドを呼び出して実行する __call メソッドがまだ使用されていることがわかります。
次に、init メソッドに進みます。このメソッドは、キャッシュ値を設定するときに詳しく説明されています。
実行プロセスによると、init メソッドが自動的にキャッシュを初期化することがわかります (最初に実行されるのはここではなく make メソッドであることに注意してください。make メソッドが実行されると、値はハンドラの属性に格納され、2 回目の call メソッドを介して入力するとすぐに戻り、再度実行されることはありません。ここに注意する必要があります)
なぜキャッシュのmakeメソッドが最初に実行される? これは、コンテナ内にキャッシュクラスのインスタンスを作成する際に、クラス内にmakeメソッドが存在するかどうかをmakeメソッド内で判定し、存在する場合はそれを先に実行するためです。
したがって、キャッシュ クラスでreturn call_user_func_array([$this->init(), $method], $args ) ;
このコードは、thinkphp/library/think/cache/driver/File.php
このクラスのメソッドを取得します
このクラスでは、キャッシュ値を設定する際に解析に時間がかかるメソッドが確認できます。 getCacheKey
このメソッドでは、主に sbustr が使用されます。値のスタンザを暗号化します。最初の 2 つの値はディレクトリ、残りの文字はファイル名です。
次に、ファイル名を返します。
次に、file_get_contents を使用してファイルの内容を取得します
その後、引き続き下を見てください。ここには期限切れの削除されたキャッシュ ファイルがあります。
フレームワークの有効期限ポリシーでは、有効期限を設定すると、キャッシュは期限切れ直後に削除されず、再度アクセスした後に削除されます。
この戦略は、redis での遅延削除です。遅延削除を使用すると、データは有効期限が切れても自動的に削除されません。その場合、その削除方法は、次回キー値が取得されたときに、Make aキーの有効期限が切れているかどうかを判断し、有効期限が切れている場合は削除します。
ここまでで、ソース コード解析によってキャッシュ取得の実行処理が完了しました。コンテンツは分析されたときに取得されます。
それでは、なぜキャッシュされたデータの取得について話す必要があるのでしょうか? それは、ここで説明する必要があるからです。
キャッシュの設定時に、キャッシュされた値を書き込むときに問題が発生しました。 Functiongzcompress
しかし、キャッシュ値を取得してファイルからデータを読み取るときに、関数gzuncompress
に遭遇しました。実は設定から キャッシュとキャッシュ取得の2つの機能から、圧縮データが設定され、伸長データが取得されていることが分かります。
PHP には他に 2 つの圧縮関数があります: gzdeflate と gzencode
。同じ解凍関数は gzinflate gzdecode
にも対応します。関数はすべて圧縮ですが、関数の場合、基礎となる実装が異なります。
gzcompress は ZLIB 形式を使用します;
gzdeflate は純粋な DEFLATE 形式を使用します;
gzencode は GZIP 形式を使用します;
上記は、一部を理解するだけです。データの圧縮と解凍に関する知識。
このセクションでは、Kaka がフレームワークのキャッシュ処理結果について説明します。
実際、Kaka は以前、フレームワークに付属するキャッシュ応答時間が 3 分の 1 に短縮されることをテストしました。もちろん、これはデータ量によっても異なります。
PHP フレームワーク ThinkPHP のソース コード解釈はここまでです。後で時間があれば、まだ解釈されていない内容の一部を解釈します。言及された。
最後に、ソースコードを読むのは本当に疲れます。
「学習の継続、ブログの継続、共有の継続は、キャリア以来、カカが常に支持してきた信念です。Nuoda Internet でのカカの記事が何かをもたらすことを願っています」助けてください。私はカカです。また次回お会いしましょう。
”
以上がThinkPHP キャッシュ ソース コードの詳細な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。