13

これが基本的なものである場合は申し訳ありませんが、PHP の OO についてできる限り多くのことを学ぼうとしており、その使用方法をゆっくりと学んでいます (非常に限られています)。

__autoload() が PHP オペコード キャッシュに影響を与えるかどうかを知りたいですか?

4

2 に答える 2

27

オペコード キャッシュは自動読み込みで機能します (または、少なくとも機能するはずです) が、パフォーマンスが低下する可能性があります。

Remember: be nice to byte code cachesから:

<arnaud_> does autoload have a performance impact when using apc ?
<Rasmus_> it is slow both with and without apc
<Rasmus_> but yes, moreso with apc because anything that is autoloaded is pushed down into the executor
<Rasmus_> so nothing can be cached
<Rasmus_> the script itself is cached of course, but no functions or classes
<Rasmus_> Well, there is no way around that
<Rasmus_> autoload is runtime dependent
<Rasmus_> we have no idea if any autoloaded class should be loaded until the script is executed
<Rasmus_> top-level clean deps would speed things up a lot
<Rasmus_> it's not just autoload
<Rasmus_> it is any sort of class or function declaration that depends on some runtime context
<Rasmus_> if(cond) function foo...
<Rasmus_> if(cond) include file
<Rasmus_> where file has functions and classes 
<Rasmus_> or heaven forbid: function foo() { class bar { } }

そしてRamusからのこのメール

明確にするために、もちろん、条件付きで含まれるファイルはコンパイルされてキャッシュされます。問題は含まれているファイルではなく、条件付きで定義された結果のクラスと関数を要求ごとに再定義する必要があることです。それが重要であるかどうかは、状況の詳細に依存しますが、速度が遅いことは間違いありません。たとえば、NOP と FETCH_CLASS を比較すると、NOP の方が明らかに高速です。

于 2009-09-09T01:34:30.990 に答える
16

(免責事項:私はAPCしか知りません)

オペコードキャッシュが行うことは次のとおりです。

  • ファイルが含まれている/必要な場合、そのファイルへのフルパスを取ります
  • そのファイルに対応するオペコードがすでに RAM (オペコード キャッシュ内) にあるかどうかを確認します。
    • はいの場合、それらのオペコードを返して実行します
    • そうでない場合は、ファイルをロードして opcodes にコンパイルします。オペコードをキャッシュに保存します。

ここで重要な点は、エントリ ポイント、つまりファイルへのフル パスです。


オートローディングが一般的に行うことは次のとおりです。

  • クラスの名前を取得する
  • それをファイルの名前に変換します
  • そのファイルを含める/要求する

そのため、オペコード キャッシュに関連する情報 (ファイルへのフル パス、およびそれが含まれている/必要であるという事実) はまだここにあります。

結果として、autoload が op コードのキャッシングに問題を引き起こすことはありません。

(そして、APCを使用する場合、私が知る限り、そうではありません)

于 2009-09-08T21:56:19.023 に答える