3

データベースから配列を作成しているphp生成のjavascriptページがあり、ページの読み込み時間を完全に殺しています。このページには php 拡張機能があり、現在ヘッダーを使用してそのコンテンツ タイプをアプリケーション/JavaScript としてマークしています。

オンラインで可能な解決策を見つけましたが、ページの読み込み時間を短縮するのにあまり効果がないようです。現在のファイルのヘッダー コードは次のとおりです。

header("Cache-Control: must-revalidate");
$offset = 60 * 60 * 24 * 3;
$ExpStr = "Expires: " . gmdate("D, d M Y H:i:s", time() + $offset) . " GMT";
header($ExpStr); 
header("Content-type: application/javascript");

これらのデータベース呼び出しを常にロードしようとしないように、ファイルをキャッシュするために何か特別なことをする必要がありますか? IIS 7.5 と PHP 5.3.13 を使用しています。

4

3 に答える 3

1

配列をタグにハードコーディングしているように見えます。配列が本当に大きい場合、ブラウザはより多くのバイトをロードする必要があります。

JSONと組み合わせてAJAXを使用することを検討してください。たとえば、jQueryを使用して、別のスクリプトからデータをロードします。例:api.php?req=getBigArray。そして、配列がロードされたときにロジックを実行するためのjQueryの「成功」コールバック。これは、2つのhttpリクエストが実行されることを意味しますが、ページは一度にロードされます。

サーバ側:

<?php //api.php
switch($_GET['req']){
 case "getBigArray": 
    $arrayFromDatabase = array( /* Load from db ... */ );
    echo json_encode($arrayFromDatabase); 
 break;
}

クライアント:

$(document).ready(function(){
    $.getJSON('api.php?req=getBigArray', function(data) {
        console.log(data); // Use data in some way.
    });
});

これにより、ロジックがサーバーサイド/フロントエンドから切り離されます。

バックエンドで結果をキャッシュする場合は、memcache/apcを確認することもできます。本当にシンプルなAPIですが、サーバー側に追加のソフトウェアをインストールする必要があります。

于 2013-01-05T18:32:21.357 に答える
1

私は常にmax-ageディレクティブでキャッシュコントロールを使用してきました。

header('Cache-Control: max-age=' . $expires);
header('Expires: ' . gmdate('D, d M Y H:i:s', time() + $expires) . ' GMT');

しかし、私も前のコメントに同意します。あなたのデータベース呼び出しが本当に高価な場合は、それらの呼び出しが行われる頻度を相殺することを考えてください。たとえば、毎日 1 回データベース キャッシュを更新する場合は、次のようにします。

  • データベースクエリの結果をファイルに書き込み、生成日に基づいて名前を付けます。
  • これらの呼び出しを行うファイルで、キャッシュされたファイルの生成日を確認し、1 日より古い場合は再生成します。それが若い場合は、キャッシュを読み取って使用するだけです。

オプションで、IIS にタスク スケジューラを介して更新スクリプトを実行させることができます。その後、js を作成するスクリプトは年齢チェックを実行できず、キャッシュから読み取るだけです。

于 2013-01-05T18:28:15.907 に答える
1

データベースクエリがそれほど高価な場合、最も簡単な方法は、生成された出力全体をファイルに書き込み、ページが読み込まれるたびにデータベースをクエリする代わりにファイルを出力することです。その後、データベースが変更されたときにファイルを削除/更新するだけです。

また、メモリ キャッシュを調べることを検討し、可能であればクエリの最適化を試みる必要があります。

于 2013-01-05T18:14:54.370 に答える