5

2 パス キャッシュ システムを実装したい:

  • 最初のパスでは、PHP ファイルが生成され、すべての一般的な内容 (ニュース項目など) がハードコーディングされます。データベースには、これらをページにリンクするためのキャッシュ テーブルがあり (例: "index.php page=1 style=default")、データベースには uptodate フィールドも格納されます。これが false の場合、次回のページで最初のパスが再実行されます。が表示されます。

  • 2 番目のパスは、何か (?) がどれくらい前のものか、および「あなたは次のようにログインしています...」のような変更可能な項目など、細かい詳細を入力します。

ただし、多くのコードといくつかのクエリなしで、キャッシュされたページとキャッシュされていないページ (検索など) の両方をサポートする効率的な実装についてはわかりません。

現在、ページが読み込まれるたびに PHP スクリプトが実行され、ページが再生成されます。検索のようなページでは、ほとんどの検索が異なるため、これで問題ありませんが、インデックスなどの他のページでは、ヒットごとに実質的に同じですが、多数のクエリが生成され、非常に長いスクリプトになります。

問題は、ページの一部がユーザーごとに変更されることです。たとえば、「あなたは次のユーザーとしてログインしています...」セクションなどです。そのため、生成されたページを単純に保存すると、ほぼ同一のページが 10,000 ページになることになります。

私は共有ホスティングを使用しており、現時点ではアップグレードする余裕がないため、主な懸念事項はサーバーの負荷を軽減することですが、サイトはサーバーの CPU のかなりの部分を使用し、MySQL にかなりの負荷をかけています。サーバ。

したがって、基本的には、各ページ リクエストに対して実行する必要がある量を最小限に抑え、ニュース アイテムのようなものを常にインデックスに再生成しないようにすることは、良いスタートのように思えます。

実際には、ニュース項目をプレーンな HTML としてハードコーディングすることを検討しましたが、それはそれらをいくつかの場所に維持することを意味します (それらは検索に使用される可能性があり、コメントはそのニュース項目専用のページ (つまり、news.php) にあるためなど)。 .

4

6 に答える 6

6

PEAR のCache_Liteライブラリの Ken の記述を 2 番目に引用します。これを使用すると、ページの一部またはページ全体を簡単にキャッシュできます。

独自のサーバーを実行している場合は、代わりにmemcachedを強くお勧めします。完全にメモリ内で実行され、大量のサイトで広く使用されているため、はるかに高速です。これは、非常に簡単に実行でき、安定した、トラブルのないデーモンです。PHP コードに関しては、Cache_Lite とほとんど同じように使用して、さまざまなページ セクションまたはページ全体 (または他の任意のデータの塊) をキャッシュします。PHP にはmemcache インターフェイスが組み込まれているため、非常に使いやすいです。 .

超高トラフィックの全ページ キャッシングについては、キャッシング リバース プロキシ サーバーとしてVarnishまたはSquidを実行することを検討してください。(Varnish によって提供されるページは、PHP インタープリターにヒットするページよりも簡単に 100 倍速く表示されます。)

キャッシュについては、頻繁にアクセスされるものだけをキャッシュする必要があることに注意してください。本当に必要のないときに、非常に洗練されたキャッシング戦略を開発するのは、落とし穴になることがあります。ホームページのように 1 秒間に数回ヒットするページの場合、間違いなく速度を最適化する必要があります。1 か月前のブログ記事のように、1 時間に数回しかヒットしないページの場合、キャッシュするのは得策ではありません。時間を無駄にするだけで、物事がより複雑になり、バグが発生しやすくなります。

于 2008-10-01T07:46:25.947 に答える
4

車輪の再発明はしないことをお勧めします... Smartyのように、キャッシングをサポートするテンプレート エンジンがいくつかあります。

于 2008-10-01T07:30:55.283 に答える
3

サーバー側のキャッシュには、Cache_Liteのようなものを使用します(ファイルのロック、有効期限、ファイルの破損について他の人に心配させます)

于 2008-10-01T07:28:14.743 に答える
1

結果をファイルに保存し、次のようなロジックを使用して結果を引き出す必要があります。

if filename exists
    include filename
else
    generate results
    render to html (as string)
    write to file
    output string or include file
endif

明確にするために、ページの一部を保存し、残りを動的のままにしておくことができるため、2 つのパスは必要ありません。

于 2008-10-01T07:25:05.920 に答える
1

このタイプの質問と同様に、私の回答は次のとおりです。

  • なぜキャッシングが必要なのですか?
  • アプリケーションがデータベースで大量の IO を消費していませんか?
  • どの指標を実行しましたか?

アプリにさらにレベルの複雑さを追加することについて話しているので、実際にそれが必要であることを十分に確認する必要があります.

データベースがシステムの競合ポイントである場合は、組み込みの MySQL クエリ キャッシュを使用することで実際にメリットが得られる場合があります。もう 1 つのオプションは、Memcache を使いすぎることです。

于 2008-10-01T07:48:57.003 に答える
0

既存のキャッシュ メカニズムを使用することをお勧めします。本当に必要なものに応じて、APC、memcached、さまざまなテンプレート キャッシング ライブラリを探しているかもしれません...すべてをゼロから作成するよりも、作成/テストされたコードを調整してニーズを満たす方が簡単/高速です。(通常、選択の余地がない場合もありますが)

于 2008-10-01T07:47:23.700 に答える