2009-06-18 6 views
2

PHPオブジェクトをディスクにキャッシュするのとは異なりますキャッシュされている場合、オブジェクトはすべてのサイト訪問者に対して一度だけ作成され、存在しない場合はすべての訪問者に対して一度作成されます。このためのパフォーマンスの違いはありますか、これを行う時間を無駄にしていますか?PHPオブジェクトのキャッシュパフォーマンス

それがダウンしてそれに来るとき、基本的に、主な問題は、メモリ内の

複数のオブジェクト、PERユーザー(各ユーザーがインスタンス化されたオブジェクトの彼自身のセットがあります)

VS

シングルすべてのユーザー(同じエラーハンドラクラス、同じテンプレートハンドラクラス、同じデータベースハンドルクラスなど)をすべてのユーザーのファイルにキャッシュしたオブジェクト。

答えて

3

ディスク上のPHPオブジェクトをキャッシュするのではなくない間に違いはありますか?

すべてのパフォーマンスの微調整と同様、完全に理解していないブードゥー教の儀式を盲目的に実行するのではなく、何をしているのかを測定する必要があります。 オブジェクトを$_SESSIONに保存すると、PHPはオブジェクトの状態を取得し、ファイルを生成します(シリアル化)。次のリクエストで、PHPは新しいオブジェクトを作成し、このオブジェクトをこの状態で再設定します。このプロセスは、オブジェクトを作成するだけでなく、PHPがディスクI/Oを作成してシリアル化されたデータを解析する必要があるため、はるかに高価です。これは、読み取りと書き込みの両方で発生する必要があります。

一般に、PHPは非共有アーキテクチャとして設計されています。これには長所と短所がありますが、何とか回避しようとすると、通常はあまり良いアイデアではありません。しかし、自分自身のためのベンチマーク

http://code.google.com/p/php-object-cache/

、結果を比較:メモリにキャッシュされたオブジェクトを持つ

0

私は時間が無駄だと思う静的です生成する複雑である。

ACL(アクセスコントロールリスト)を表すオブジェクトがあり、特定のリソースに対してどのユーザーレベルに権限があるかを示しているとします。

特に、データがデータベースから取得されている場合は、このACLにデータが格納されるまでにかなりの時間がかかることがあります。キャッシュされたACLをはるかに迅速にインスタンス化することができます。

0

私はキャッシュSQLクエリの結果と時間のかかる計算結果を使用して印象的な結果を得ました。今私は、200,000以上のレコードを持つテーブルから200個以上のデータベースレコード(SQL関数とその中の計算が多い)を取得し、取得したデータの結果を各要求ごとに計算するアプリケーションに取り組んでいます。私は、計算結果をキャッシュするためにZend FrameworkののにZend_Cacheコンポーネントを使用するので、次回は私がする必要はありません。

  1. 結果を返す、私の記録、計算、私のSQL関数を見つけるために、データベース・サーバのデータベースに
  2. 待機を接続します
  3. 少なくとも200(できたとしても豊富な1000)をフェッチこれらすべてのデータを超えるメモリ
  4. ステップに記録し、私はちょうど行う彼らから私が欲しいもの

を計算します。

  1. Zend_Cache :: load()メソッドを呼び出すと、ファイルが読み込まれます。私のリクエストごとに少なくとも4-5秒救う

(非常に不正確を、私は実際にそれをプロファイルしませんでした。しかし、パフォーマンスの向上は非常に表示されている)

0

、特定の場合に有用であることができますが、 (DBクエリ、データ構造、アルゴリズムなどのような)他の種類の性能改善の後に、慎重に検討することが必要です。

あなたがキャッシュするクエリは、一定(および数が限られている)で、データはかなり静的でなければなりません。効果的な(そしてその価値がある)ためには、ハードディスクのアクセスが、そのデータのDBクエリよりもはるかに速くなければなりません。

キャッシュされたオブジェクトをファイル内でシリアライズして使用したことがあります。これは、ホーム・ページの比較的静的なコンテンツで、重大な負荷をかけたシングル・インスタンスのDBを使用し、200レベル以上のヒット/そのホームページで約40%のパフォーマンスを得ました。

コード-whenスクラッチからpile_put/get_contentsとUN /シリアル化して、非常に迅速かつ簡単であることを開発。ファイルの名前は、たとえば、クエリのmd5チェックサムの後に指定できます。

6

これらのオブジェクトを使用するには、各PHPスクリプトはいずれにしてもそれらを逆シリアル化する必要があります。つまり、ディスクにキャッシュするメモリを節約するためではなく、メモリを節約することはできません。それは、オブジェクトを作成するためにあまりにも高価だとき、これらのオブジェクトをキャッシュする

理由があります。通常のPHPオブジェクトでは、そうではありません。しかし、オブジェクトが高価なデータベースクエリの結果を表す場合や、リモートWebサービスから取得された情報の場合は、ローカルにキャッシュする方が有益です。

ディスクベースのキャッシュは必ずしも大きな勝利ではありません。 PHPを使用していてパフォーマンスが懸念される場合は、APCやZend Platformなどのオペコードキャッシング環境でアプリを実行している必要があります。これらのツールは、PHPオブジェクトをアプリケーションに保存するために使用できるキャッシュも提供します。 Memcachedは、アプリケーションデータの高速メモリキャッシュの一般的なソリューションです。

また、すべてのPHPオブジェクトをシリアル化するので、キャッシュにそれらを保存し、ディスクベースまたはメモリ内かどうかをすることができない心に留めておくと、すべてのデータのために可能ではありません。基本的に、オブジェクトにPHPリソースへの参照が含まれている場合は、おそらくそれを直列化できません。

+0

私が作成しようとしているオブジェクトは、データベースからフェッチされず、PHPリソースもありません。 Memcached/Zendについては、私が開発しているソフトウェアは、低予算から共有のWebホスティングソリューションに使用されるため、Zend Optimizerやmemcachedがインストールされていない可能性があります。現時点では、私は窓で開発しているAPCの原因を使用していません) 主な質問は基本的には です。 VS 単一のオブジェクトはすべてのユーザーに対してONCEをインスタンス化しますが、データはディスクに書き込まれます – Nikko

+0

PHPは「無共有」アーキテクチャです。つまり、オブジェクトの内容がディスクから読み取られたとしても、各PHPセッションごとにオブジェクトをインスタンス化する必要があります。 –

+0

PHPを使用したプログラミングの場合、優れたパフォーマンスと効率を達成する*唯一の方法は、コードとデータの両方に効果的にメモリ内キャッシュを使用することです。ディスクI/Oは、キャッシングとしての資格がほとんどないため、コストがかかります。 –

0

残念ながら、正解はありません。同じサーバー上の同じWebサイトで同じソリューションを使用すると、パフォーマンスが向上したり、さらに悪化する可能性があります。あまりにも多くの要素(アプリケーション、ソフトウェア、ハードウェア、構成、サーバー負荷など)に大きく左右されます。

覚えておくべき点は次のとおりです。 - サーバーの最も遅い部分がハードドライブです。 - オブジェクトの作成はディスクアクセスよりも優れています。可能であれば

=>できるだけRAMでHDやキャッシュデータから滞在。

あなたはパフォーマンスの問題を持っていない場合、私は...何もしないようにアドバイスします。

パフォーマンスの問題が発生した場合:ベンチマーク、ベンチマーク、ベンチマークを。 (より良い解決策を見つける唯一の真の方法です)。そのトピックに関する

興味深いビデオ:YouTube Scalability

+0

よろしくお願いいたします。私がおそらくやることは、ユーザーがディスクキャッシュを使用するかどうかを選択する方法を追加することです。 – Nikko

0

は、ディスク上の通常優れています。それはあなただけがあなたが確かに知ることができることです。

+0

APCのようなベンチマークと比べてベンチマークがあるのだろうか? – buggedcom