コンテキストを与えるには:
最近、同僚と 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 サイトではメモリが最も貴重なリソースであり、おそらくカーネルによってキャッシュされるオートローダーのファイル システム チェックよりも懸念事項であると信じてきました。
その通りですが、ベンチマークの時間です。