多くの人が、クライアントキャッシングが過去数年にわたって使用可能であり、使用すべきであるという事実について学びましたが、誰もがこれが引き起こす問題を自分の経験から知っています。 そのため、ブラウザのキャッシュがオフになっているユーザーに生じた経験と問題を急いで共有します。 ユーザーは、キャッシュがオフになっていることを知らず、ページの読み込み速度が遅いことを訴えます。
背景(スキップ)
私が偶然働いたプロジェクトでは、多数のjava-scriptファイルの問題がありました(約40個-2つのjsライブラリ+多数の自己記述コンポーネントが使用されました)。 このような多数の順次ロードされるファイルは、長いページロードを引き起こしました。 私は同志
sunnybearの仕事に詳しい人として、これらすべてのファイルを1つにまとめてキャッシュすることを提案しました。
その結果、サイトがクラッシュし、長いページの読み込みに関する問題をまだ報告しているユーザーからのメッセージが突然あったときに、私たちはすでにリラックスしたかったのです。 短い検索の後、これらは何らかの理由でブラウザのキャッシュを無効にしているユーザーであることが発見されました。
そのため、タスクはキャッシュが無効になっているユーザーを識別し、タイムリーに通知することでした。 幸いなことに、プロジェクトの最初のページには、ポップアップのブロック、jsの動作、フラッシュのチェックのリストが既に含まれていました。 したがって、ブラウザのキャッシュにチェックを追加することは非常に論理的であり、既存の概念を台無しにしませんでした。
jsからブラウザのキャッシュを確認する方法は?
不思議なことに、Googleにこの質問をすると、リクエストの時間を計算するためのクレイジーなアイデアやその他の明確なアイデアのあるフォーラムのリストを入手しました。 したがって、作業キャッシュをチェックするアルゴリズムを考え出す必要がありました。
- サーバーにリクエストを送信します
- このリクエストのコンテンツとキャッシュヘッダーを含むレスポンスを取得します
- サーバー上のコンテンツを変更します
- 2番目のリクエストをサーバーに送信します
- 結果のコンテンツを比較します。 キャッシュが機能する場合、2番目のリクエストのコンテンツは最初のリクエストに対応し、そうでない場合は、サーバーから変更されたコンテンツを受信します
アルゴリズムのPHP実装
実装例では、2つのphpファイル+ jqueryに簡略化します。 ソリューションの本質はそれから明らかであるため、フレームワークまたは言語に合わせて自分で調整を行うことができます。
ajaxCacheChecker.phpファイルのリスト-このファイルを2回要求します
<?php $etag = 'cacheChecker' ; if ( @ strtotime ( $_SERVER [ 'HTTP_IF_MODIFIED_SINCE' ] ) == $_GET [ 's' ] || trim ( $_SERVER [ 'HTTP_IF_NONE_MATCH' ] ) == $etag ) { header ( 'HTTP/1.1 304 Not Modified' ) ; } else { $maxAge = 60 ; header ( 'Last-Modified: ' . gmdate ( 'r' , $_GET [ 's' ] ) ) ; header ( 'Etag: ' . $etag ) ; header ( 'Pragma: private' ) ; header ( 'Cache-Control: private' ) ; header ( "Expires: " . date ( "r" , $_GET [ 's' ] + $maxAge ) ) ; echo microtime ( ) ; } ?>
<?php $etag = 'cacheChecker' ; if ( @ strtotime ( $_SERVER [ 'HTTP_IF_MODIFIED_SINCE' ] ) == $_GET [ 's' ] || trim ( $_SERVER [ 'HTTP_IF_NONE_MATCH' ] ) == $etag ) { header ( 'HTTP/1.1 304 Not Modified' ) ; } else { $maxAge = 60 ; header ( 'Last-Modified: ' . gmdate ( 'r' , $_GET [ 's' ] ) ) ; header ( 'Etag: ' . $etag ) ; header ( 'Pragma: private' ) ; header ( 'Cache-Control: private' ) ; header ( "Expires: " . date ( "r" , $_GET [ 's' ] + $maxAge ) ) ; echo microtime ( ) ; } ?>
<?php $etag = 'cacheChecker' ; if ( @ strtotime ( $_SERVER [ 'HTTP_IF_MODIFIED_SINCE' ] ) == $_GET [ 's' ] || trim ( $_SERVER [ 'HTTP_IF_NONE_MATCH' ] ) == $etag ) { header ( 'HTTP/1.1 304 Not Modified' ) ; } else { $maxAge = 60 ; header ( 'Last-Modified: ' . gmdate ( 'r' , $_GET [ 's' ] ) ) ; header ( 'Etag: ' . $etag ) ; header ( 'Pragma: private' ) ; header ( 'Cache-Control: private' ) ; header ( "Expires: " . date ( "r" , $_GET [ 's' ] + $maxAge ) ) ; echo microtime ( ) ; } ?>
<?php $etag = 'cacheChecker' ; if ( @ strtotime ( $_SERVER [ 'HTTP_IF_MODIFIED_SINCE' ] ) == $_GET [ 's' ] || trim ( $_SERVER [ 'HTTP_IF_NONE_MATCH' ] ) == $etag ) { header ( 'HTTP/1.1 304 Not Modified' ) ; } else { $maxAge = 60 ; header ( 'Last-Modified: ' . gmdate ( 'r' , $_GET [ 's' ] ) ) ; header ( 'Etag: ' . $etag ) ; header ( 'Pragma: private' ) ; header ( 'Cache-Control: private' ) ; header ( "Expires: " . date ( "r" , $_GET [ 's' ] + $maxAge ) ) ; echo microtime ( ) ; } ?>
<?php $etag = 'cacheChecker' ; if ( @ strtotime ( $_SERVER [ 'HTTP_IF_MODIFIED_SINCE' ] ) == $_GET [ 's' ] || trim ( $_SERVER [ 'HTTP_IF_NONE_MATCH' ] ) == $etag ) { header ( 'HTTP/1.1 304 Not Modified' ) ; } else { $maxAge = 60 ; header ( 'Last-Modified: ' . gmdate ( 'r' , $_GET [ 's' ] ) ) ; header ( 'Etag: ' . $etag ) ; header ( 'Pragma: private' ) ; header ( 'Cache-Control: private' ) ; header ( "Expires: " . date ( "r" , $_GET [ 's' ] + $maxAge ) ) ; echo microtime ( ) ; } ?>
<?php $etag = 'cacheChecker' ; if ( @ strtotime ( $_SERVER [ 'HTTP_IF_MODIFIED_SINCE' ] ) == $_GET [ 's' ] || trim ( $_SERVER [ 'HTTP_IF_NONE_MATCH' ] ) == $etag ) { header ( 'HTTP/1.1 304 Not Modified' ) ; } else { $maxAge = 60 ; header ( 'Last-Modified: ' . gmdate ( 'r' , $_GET [ 's' ] ) ) ; header ( 'Etag: ' . $etag ) ; header ( 'Pragma: private' ) ; header ( 'Cache-Control: private' ) ; header ( "Expires: " . date ( "r" , $_GET [ 's' ] + $maxAge ) ) ; echo microtime ( ) ; } ?>
<?php $etag = 'cacheChecker' ; if ( @ strtotime ( $_SERVER [ 'HTTP_IF_MODIFIED_SINCE' ] ) == $_GET [ 's' ] || trim ( $_SERVER [ 'HTTP_IF_NONE_MATCH' ] ) == $etag ) { header ( 'HTTP/1.1 304 Not Modified' ) ; } else { $maxAge = 60 ; header ( 'Last-Modified: ' . gmdate ( 'r' , $_GET [ 's' ] ) ) ; header ( 'Etag: ' . $etag ) ; header ( 'Pragma: private' ) ; header ( 'Cache-Control: private' ) ; header ( "Expires: " . date ( "r" , $_GET [ 's' ] + $maxAge ) ) ; echo microtime ( ) ; } ?>
<?php $etag = 'cacheChecker' ; if ( @ strtotime ( $_SERVER [ 'HTTP_IF_MODIFIED_SINCE' ] ) == $_GET [ 's' ] || trim ( $_SERVER [ 'HTTP_IF_NONE_MATCH' ] ) == $etag ) { header ( 'HTTP/1.1 304 Not Modified' ) ; } else { $maxAge = 60 ; header ( 'Last-Modified: ' . gmdate ( 'r' , $_GET [ 's' ] ) ) ; header ( 'Etag: ' . $etag ) ; header ( 'Pragma: private' ) ; header ( 'Cache-Control: private' ) ; header ( "Expires: " . date ( "r" , $_GET [ 's' ] + $maxAge ) ) ; echo microtime ( ) ; } ?>
<?php $etag = 'cacheChecker' ; if ( @ strtotime ( $_SERVER [ 'HTTP_IF_MODIFIED_SINCE' ] ) == $_GET [ 's' ] || trim ( $_SERVER [ 'HTTP_IF_NONE_MATCH' ] ) == $etag ) { header ( 'HTTP/1.1 304 Not Modified' ) ; } else { $maxAge = 60 ; header ( 'Last-Modified: ' . gmdate ( 'r' , $_GET [ 's' ] ) ) ; header ( 'Etag: ' . $etag ) ; header ( 'Pragma: private' ) ; header ( 'Cache-Control: private' ) ; header ( "Expires: " . date ( "r" , $_GET [ 's' ] + $maxAge ) ) ; echo microtime ( ) ; } ?>
<?php $etag = 'cacheChecker' ; if ( @ strtotime ( $_SERVER [ 'HTTP_IF_MODIFIED_SINCE' ] ) == $_GET [ 's' ] || trim ( $_SERVER [ 'HTTP_IF_NONE_MATCH' ] ) == $etag ) { header ( 'HTTP/1.1 304 Not Modified' ) ; } else { $maxAge = 60 ; header ( 'Last-Modified: ' . gmdate ( 'r' , $_GET [ 's' ] ) ) ; header ( 'Etag: ' . $etag ) ; header ( 'Pragma: private' ) ; header ( 'Cache-Control: private' ) ; header ( "Expires: " . date ( "r" , $_GET [ 's' ] + $maxAge ) ) ; echo microtime ( ) ; } ?>
<?php $etag = 'cacheChecker' ; if ( @ strtotime ( $_SERVER [ 'HTTP_IF_MODIFIED_SINCE' ] ) == $_GET [ 's' ] || trim ( $_SERVER [ 'HTTP_IF_NONE_MATCH' ] ) == $etag ) { header ( 'HTTP/1.1 304 Not Modified' ) ; } else { $maxAge = 60 ; header ( 'Last-Modified: ' . gmdate ( 'r' , $_GET [ 's' ] ) ) ; header ( 'Etag: ' . $etag ) ; header ( 'Pragma: private' ) ; header ( 'Cache-Control: private' ) ; header ( "Expires: " . date ( "r" , $_GET [ 's' ] + $maxAge ) ) ; echo microtime ( ) ; } ?>
<?php $etag = 'cacheChecker' ; if ( @ strtotime ( $_SERVER [ 'HTTP_IF_MODIFIED_SINCE' ] ) == $_GET [ 's' ] || trim ( $_SERVER [ 'HTTP_IF_NONE_MATCH' ] ) == $etag ) { header ( 'HTTP/1.1 304 Not Modified' ) ; } else { $maxAge = 60 ; header ( 'Last-Modified: ' . gmdate ( 'r' , $_GET [ 's' ] ) ) ; header ( 'Etag: ' . $etag ) ; header ( 'Pragma: private' ) ; header ( 'Cache-Control: private' ) ; header ( "Expires: " . date ( "r" , $_GET [ 's' ] + $maxAge ) ) ; echo microtime ( ) ; } ?>
<?php $etag = 'cacheChecker' ; if ( @ strtotime ( $_SERVER [ 'HTTP_IF_MODIFIED_SINCE' ] ) == $_GET [ 's' ] || trim ( $_SERVER [ 'HTTP_IF_NONE_MATCH' ] ) == $etag ) { header ( 'HTTP/1.1 304 Not Modified' ) ; } else { $maxAge = 60 ; header ( 'Last-Modified: ' . gmdate ( 'r' , $_GET [ 's' ] ) ) ; header ( 'Etag: ' . $etag ) ; header ( 'Pragma: private' ) ; header ( 'Cache-Control: private' ) ; header ( "Expires: " . date ( "r" , $_GET [ 's' ] + $maxAge ) ) ; echo microtime ( ) ; } ?>
<?php $etag = 'cacheChecker' ; if ( @ strtotime ( $_SERVER [ 'HTTP_IF_MODIFIED_SINCE' ] ) == $_GET [ 's' ] || trim ( $_SERVER [ 'HTTP_IF_NONE_MATCH' ] ) == $etag ) { header ( 'HTTP/1.1 304 Not Modified' ) ; } else { $maxAge = 60 ; header ( 'Last-Modified: ' . gmdate ( 'r' , $_GET [ 's' ] ) ) ; header ( 'Etag: ' . $etag ) ; header ( 'Pragma: private' ) ; header ( 'Cache-Control: private' ) ; header ( "Expires: " . date ( "r" , $_GET [ 's' ] + $maxAge ) ) ; echo microtime ( ) ; } ?>
index.phpファイルのリスト-このファイルは、いわばアプリケーションです
- <?php $ timeStamp = time ( ) ; ?>
- <html>
- <head> <script type = "text / javascript" src = "js / jquery.js"> </ script> </ head>
- <本体>
- <div id = "cacheCheck">キャッシュの確認</ div>
- <スクリプト>
- var cacheCheck1 = "";
- var cacheCheck2 = "";
- 関数checkBrowserCache(){
- $ .get( "ajaxCacheChecker.php?s = <?= $ timeStamp ?> "、function(data){
- cacheCheck1 =データ。
- $ .get( "ajaxCacheChecker.php?s = <?= $ timeStamp ?> "、function(data2){
- cacheCheck2 = data2;
- checkBrowserCacheResults();
- });
- });
- }
- 関数checkBrowserCacheResults(){
- if(cacheCheck1!= cacheCheck2){
- $( '#cacheCheck')。text( 'cache disabled。ブラウザのキャッシュを有効にしてください...');
- } else {
- $( '#cacheCheck')。text( 'cache enabled!');
- }
- }
- checkBrowserCache();
- </ script>
- </ body>
- </ html>
欠点
解決策はOperaおよびSafariでは機能しません
これらのブラウザーのサポートを追加する方法を知っている場合-コメントを書く
おわりに
私の研究が、長い読み込みページで顧客やユーザーとの論争を解決するのに役立つことを願っています。
この決定は、すべてのページで検証が行われることを意味するものではありません。 どこでも検証を実装する場合は
、同志
maghamed によるコメントで指定されたロジックを使用します
UPD :アルゴリズムのセッションを
削除してくれた仲間の
tenshiと
TheShockに感謝
UPD2 :同志の
zerkmsによるコメント。 OperaとSafariのバグを発見