PHPのキャッシュ保存、キャッシュ拒否、ディレクトリキャッシュについて

PHPプログラミング PHP/MySQL

キャッシュについて

Webアクセラレータに保存されたキャッシュとWebサーバからのデータに振り分けられるようになっている。また、Webアクセラレータの中には、単にデータをキャッシュしておくだけではなく、画像やテキストデータそのものを変換したり圧縮したりすることによって、応答時間の短縮を図るものものある。
参照元:IT用語辞典バイナリ キャッシュ保存方法

キャッシュをみてサイトへの訪問済かどうかを確認する

キャッシュはブラウザの機能。保存時間やキャッシュ保存はサイト制作者側でコントロールできるが、キャッシュクリアは出来ない。閲覧ユーザー側でキャッスは削除する必要がある。 確認したところWordPressのキャッシュファイル数は300以上ある。

PHP


//全てのキャッシュを表示する
 var_dump(realpath_cache_get()); 

「アクセラレータ」によるキャッシュ機能

ウェブサイトの表示内容を、「キャッシュサーバー」に一時的に記録(キャッシュ)し、同じウェブサイトにアクセスがあった場合、キャッシュサーバーから応答しているので、速度が速い。ただし、更新した場合は、キャッス情報が優先されるので更新情報が閲覧できないことがある。WEBサーバー会社より「キャッシュ用サーバー」がサービスされている。

高速・安定CDN ウェブアクセラレータ | さくらインターネット

さくらインターネットCDN開発・運用者の記事

ロリポップ

ロリポップ・レンタルサーバーでwebサーバーの設定で「アクセラレータ」がONになっていると、キャッシュが自動で保存される。

一部ページのみキャッシュさせない

PHP


//特定ページだけキャッシュしない場合に記載
header("Cache-Control: no-cache");//Noキャッシュ

キャッシュ情報はディレクトリ名

ブラウザに送られた情報は、ディレクトリ名でかえされる。 さくらインターネットなら”/home/(アカウント名)/www/フォルダ名”という感じ。

コールドスタートファイルとディレクトリキャッシュ

クライアントが初期設定されるとき、クライアントには「コールドスタートファイル」が与えられます。コールドスタートファイルの目的は、名前空間内のサーバーと連絡をとるための起点として使用できるディレクトリオブジェクトのコピーをクライアントに提供することです。ディレクトリオブジェクトには、アドレス、公開鍵、およびそのディレクトリをサポートするマスターサーバーと複製サーバーについての情報が収められています。通常、コールドスタートファイルには、クライアントのホームドメインのディレクトリオブジェクトが収められています。
コールドスタートファイルとディレクトリキャッシュ ネームサービススイッチ

realpathキャッシュ

PHPは読込した全ファイルのrealpathキャッシュを保存して。require_once()関数の”once”判定で利用している。

PHP


//(読み込んだキャッシュの例)
array(7) {
	 ["/home/(アカウント名)"]=> array(4) {
		 ["key"]=> float(1.67979824105836E+19) 
		 ["is_dir"]=> bool(true) 
		 ["realpath"]=> string(11) "/home/(アカウント名)" 
		 ["expires"]=> int(1618802947) 
	}
	 ["/home"]=> array(4) {
		 ["key"]=> int(4353355791257440477) 
		 ["is_dir"]=> bool(true) 
		 ["realpath"]=> string(5) "/home" 
		 ["expires"]=> int(1618802947) 
	}
	 ["/home/(アカウント名)/www"]=> array(4) {
		 ["key"]=> int(76471217187065706800) 
		 ["is_dir"]=> bool(true) 
		 ["realpath"]=> string(15) "/home/(アカウント名)/www" 
		 ["expires"]=> int(1618802947) 
	}
	 ["/home/(アカウント名)/www/mzashop.com/web_program"]=> array(4) {
		 ["key"]=> int(39533844017404858403) 
		 ["is_dir"]=> bool(true) 
		 ["realpath"]=> string(47) "/home/(アカウント名)/www/mzashop.com/web_program" 
		 ["expires"]=> int(1618802947) 
	}
	 ["/home/(アカウント名)/www/mzashop.com"]=> array(4) {
		 ["key"]=> float(1.61903151006648E+19) 
		 ["is_dir"]=> bool(true) 
		 ["realpath"]=> string(35) "/home/(アカウント名)/www/mzashop.com" 
		 ["expires"]=> int(1618802947) 
	}
	 ["/home/(アカウント名)/www/mzashop.com/web_program/program_page.php"]=> array(4) {
		 ["key"]=> float(1.35555450572029E+19) 
		 ["is_dir"]=> bool(false) 
		 ["realpath"]=> string(69) "/home/(アカウント名)/www/mzashop.com/web_program/program_page.php" 
		 ["expires"]=> int(16108802947) 
	}
}

Last-Modifiedを使ったコンテンツの最終更新時刻を送信

Last-Modifiedヘッダで更新日時を記載しておくと、ブラウザ側で保存日時が保存される。リクエストした際にリクエストヘッダの中に含めて送信します。サーバー側のコンテンツに変更がなければサーバーはステータスコード304という「コンテンツ未更新」ステータスコードを送ることで更新を判定する。ApacheやNginxなどのWEBサーバー側で適切な設定をすることで、更新日時を送信する。Etagのほうが使いやすいかも。

Entityタグで更新を判別させる

Entityタグ(ETags)はWebサーバーやブラウザが、ブラウザのキャッシュされたコンポーネントとWebサーバ上のオリジナルが一致しているかどうかを決定するためのメカニズム。コンテンツごとにETAGを生成する。リクストの際に、生成したETAGがあれば、ETAGの内容をIf-None-Matchヘッダに含めてWEBサーバーに送信。変更点があるかないかを判別する。 同じ場合は、ブラウザに304 (Not Modified)ステータスコードを送る。 例えば同じURLで言語表示が違う場合は、それぞれ異なるEntityタグを設定しておくと、別ページとして認識する。

ロードバランサーなど複数サーバー運用の注意

ETAGをつけておけばキャッシュコントロールは全てOKといえるかというと、それはあくまで配信するサーバーが1つの場合の話です。ETAGはロードバランサー配下にオリジンサーバーを複数台構成で運用しているケースではETAGには思わぬ落とし穴になることがあります。 これは、ETAGというランダムなタグを生成するメカニズムに起因します。
ETAG利用のメカニズムの注意(ETAGに潜む罠)

symlinkを利用したデプロイ

デプロイ(deploy)は、「配置する」「配備する」「展開する」を意味する。、開発した機能やサービスを利用できる状態にする作業を指す言葉。ソフトウェアをインストールする作業や、テストが実行できる状態にすることも「デプロイ」という。 新旧のファルキャッシュを入れ替えたい場合は、日付ディレクトリを作り、デプロイさせる方法がある。

symlink切替のメリット

symlinkで日付ディレクトリを作って切り替えすることで、全ファイルを更新した状態で読込出来る。 第七回闇PHP勉強会 (2016/12/11) 発表資料

Expiresヘッダを利用する

現在ではCache-Controlヘッダのほうが一般的 ExpiresヘッダはレスポンスヘッダのひとつでApacheやNginxなどのWEBサーバー側で適切な設定をすることによって、新しいファイルが存在しているかどうかを確認することなく、ブラウザでキャッシュ済みのファイルを強制的に適用するEtagやIMSより優先度が高いヘッダです。 キャッシュ済みのファイルを強制的に読み込む期間を指定するため、Expiresヘッダで指定した期間は強制的にコンピュータ内に保存されたキャッシュファイルを読み込むことになります。
[AWS] Amazon CloudFrontのキャッシュ無効化(TTL設定)
タイトルとURLをコピーしました