16

コンテキストを与えるには:

最近、同僚と PHP でのオートローダーの使用について話し合いました。私は彼らに賛成し、彼は反対した。

私の見解では、Autoloader を使用すると、手動のソース依存を最小限に抑えることができ、その結果、必要のない大きなファイルを多数含めるときに消費されるメモリの量を減らすことができます。

彼の回答は、必要のないファイルをインクルードすることは大きな問題ではないというものでした。ファイルがインクルードされると、Apache 子プロセスによってメモリに保持され、メモリのこの部分が後続のリクエストで使用できるようになるからです。彼は、インクルードされたファイルの量について心配する必要はないと主張しています。なぜなら、すぐにすべてのファイルがメモリにロードされ、メモリからオンデマンドで使用されるからです。したがって、メモリはそれほど問題ではなく、ファイルシステムで必要なファイルを見つけようとするオーバーヘッドの方がはるかに重要です。

彼は頭が良く、彼が話していることを理解する傾向があります。しかし、Apache と PHP が使用するメモリは、処理されている特定の要求に固有のものであると常に考えていました。各リクエストには PHP オプションの memory_limit に等しい量のメモリが割り当てられ、ソースのコンパイルと処理はリクエストが存続している間のみ有効です。

APC などのオペコード キャッシュを使用しても、個々の要求はメモリの独自の部分に各ファイルをロードする必要があり、APC は応答プロセス用にプリコンパイルするためのショートカットにすぎないと考えました。

私はこれに関するいくつかのドキュメントを探してきましたが、これまでのところ何も見つけることができませんでした. 誰かがこのトピックに関する有用なドキュメントを教えてくれれば、本当に感謝しています。

アップデート:

明確にするために、オートローダーの議論の部分は、より文脈に沿ったものでした:)。

明確ではないかもしれませんが、私の主な質問は、Apache が複数の要求 (特に、インクルード ファイルによって使用されるメモリ) に応答するためにリソースをプールするかどうか、または各要求が実行パスを満た​​すために必要なコードを取得する必要があるかどうかです。同じプロセスから処理される他のリクエストからの分離。

例: ファイル 1、2、3、および 4 は、それぞれ 100KB の等しいサイズです。リクエスト A にはファイル 1、2、および 3 が含まれます。リクエスト B にはファイル 1、2、3、および 4 が含まれます。

ファイル 1、2、および 3 が既にメモリ内にあるため、リクエスト A は実行全体で 300KB を消費し、リクエスト B はさらに 100KB しか消費しないと考えています。

私の考えでは、300KB と 400KB です。なぜなら、それらは両方とも独立して処理されているからです (同じプロセスによる場合)。

これは、私の「リクエストサイズを抑えるために必要なものだけを含める」とは対照的に、「とにかく使用するので、ロットを含めるだけでよい」という彼の主張に戻ります。

これは、私が PHP Web サイトを構築する方法のかなり基本的なものなので、ここで的外れであるかどうか知りたいと思います。

また、私は常に、大規模な Web サイトではメモリが最も貴重なリソースであり、おそらくカーネルによってキャッシュされるオートローダーのファイル システム チェックよりも懸念事項であると信じてきました。

その通りですが、ベンチマークの時間です。

4

3 に答える 3

4

議論に勝つ方法は次のとおりです。現実的なベンチマークを実行し、数字の右側に立ちます。

これと同じ議論があったので、実験してみました。APC を使用して、単一のモノリシック インクルード (Kohana のすべてを含む) と標準のオートローダーを使用して、Kohana アプリを試しました。最終的な結果として、シングル インクルードは統計的に無関係な割合 (1% 未満) で高速になりましたが、わずかに多くのメモリを使用しました (PHP のメモリ関数によると)。APC (または XCache など) なしでテストを実行しても意味がないので、気にしませんでした。

したがって、オートローディングの方がはるかに簡単に使用できるため、オートローディングを引き続き使用するというのが私の結論でした。アプリで同じことを試して、友達に結果を見せてください。

今、あなたは推測する必要はありません。

免責事項: 私は Apache を使用していませんでした。独自のアプリの独自のハードウェアで独自のベンチマークを実行することは強調しきれません。私の経験があなたのものになるとは信じないでください。

于 2012-07-13T14:21:21.160 に答える
2

あなたは賢い忍者、バッタです。

オートローダーは、クラスが要求されるまでクラス ファイルをロードしません。これは、manual が含むものと同じ量のメモリを使用することを意味しますが、通常ははるかに少なくなります。

クラスは、Apache スレッドが複数の要求を処理できる場合でも、要求ごとにファイルから新たに読み取られるため、「最終的にすべてが読み取られる」友人は水を保持しません。

これは、echo 'foo'; を置くことで証明できます。クラスファイルのクラス定義の上。新しいリクエストごとに、開始時にクラスファイルの全世界を自動ロードするか手動で含めるかに関係なく、行が実行されることがわかります。

これに関する適切で簡潔なドキュメントを見つけることができませんでした.メモリ使用の例をいくつか書くかもしれません.これを他の人に説明し、それを理解させるための証拠を示さなければならなかったからです.zendの人々はオートローディングの利点を理解していない人がいるとは思いませんでした。

はい、apc など (すべてのキャッシュ ソリューションと同様) は、リソースのマイナス面を克服し、パフォーマンスのわずかな向上を探すことさえできますが、自明ではない数のライブラリでこれを実行し、多数のサービスを提供すると、不要なメモリを大量に消費します。クライアントの。ページに同時にヒットする500の接続を処理しながら、大規模なインクルードファイルに梨ライブラリの健全なチャンクをロードするようなことを試してください。

Apc のようなものを使用しても、名前空間のないクラス (現在のほとんどの既存の php コード) でオートローダーを使用すると、多数のクラス ライブラリを処理するときにグローバルな名前空間の汚染を回避できるため、メリットがあります。

于 2012-07-13T14:11:06.377 に答える
0

これは私の意見です。

次の理由から、オートローダーは非常に悪い考えだと思います

  1. スクリプトが何をどこからデータ/コードを取得しているかを知りたいです。デバッグを容易にします。
  2. これには、開発者の 1 人がファイル (アップグレードなど) または構成を変更し、動作が停止した場合に、どこが壊れているかを見つけるのが難しくなるという点で、構成の問題もあります。
  3. 怠惰なプログラミングだとも思います。

メモリ/パフォーマンスの問題に関しては、問題が発生している場合は、コンピュータ用に追加のメモリを購入するのも同じくらい安価です。

于 2012-07-13T14:33:45.077 に答える