7

私たちの PHP ベースのアプリケーションのために、オペコード キャッシング/Zend アクセラレーション (これらは同じものだといつも思っていました) を調べている同僚がいます。彼のベンチマークは、require_once を使用して (大規模な) クラス ライブラリを含めてもパフォーマンスが向上しないことを示しているようですが、include_once を使用するとパフォーマンスが向上します。

これは私たち二人にとって生臭いにおいがしますが、ベンチマークの方法論を自分でチェックする時間はありません。私の同僚は私よりも魚のにおいに対して寛容です. :)

誰もこのようなことに遭遇したことがありますか? そうでない場合、include_once から require_once に切り替えることでパフォーマンスが向上したように見える原因となっている可能性のある他のことについて何か考えはありますか?

4

2 に答える 2

12

まず、両方の呼び出し (require_once と include_once) で、ファイルが以前にインクルードされていないかどうかを再確認します。

したがって、両方がこれを達成する方法は、利用可能なすべてのパスでファイルを検索し、以前にミックスされていないかどうかを基本的に確認することです..

バックグラウンドで、すべての異なるオプション (複数の include_path など) を評価し、この省略形から実パスを作成することで、一意の識別子を作成します。同じパスは 2 つではなく、1 つだけです。

これは地球上で最速のプロセスではなく、通常、PHP の各リクエストで発生します。次に、別の高価な操作を追加します。これは、ファイルが存在するかどうかを確認するために、私が realpath と呼んだもの (realpath() が行うことの一種であるため、realpath) を作成するときの統計です

間違っている場合は訂正してください。ただし、APC には特にこの場合の最適化があります。

とにかく、require_once と include_onceの違いについて説明します。これは、require_once がファイルをインクルードするときに (低レベルの解析エラーなどについて) ファイルを評価することです。これは、解析エラーがインクルードに忍び込むことがないように十分な QA が整っている場合は、取り除くことができる追加のチェックです。

それ以外の方法を見つけるのは難しいです。:-)

(考慮すべき点: require_once で開発し、デプロイ時にすべての呼び出しを include_once に置き換えることができます。)

オペコードキャッシュについては、APCをお勧めします。以前にstackoverflowで議論されました。個人的には、しばらくの間それを使用しており (3 つのフロントエンドと 1 つのバックエンドで 1 日あたり約 10 万人の訪問者を処理しています)、非常に満足しています。APC は、require_once/include_once の狂気に対しても最適化されています。

非常にクールな副作用として、APC では PHP 変数をメモリに格納することもできます (一種の永続化など)。

いくつかの追加のポインター:

  1. 多くの人が__autoloadを使用してアプリケーションを高速化すると主張しています。
  2. オペコード キャッシュでは、条件付きの require_once/include_once を回避します (たとえば、ループまたは制御フロー内)。
  3. /absolute/path/to/file.php を include_ または require_once に指定した方が、include_path に依存するよりも高速であると言う人もいます。
  4. include_path 内のパスの順序も重要です。

それが役立つことを願っています。

于 2008-10-17T00:18:50.657 に答える
0

十分に詳しく調べていないため、何も保証できませんが、はい、2つの速度の違いを見てきました. ただし、require_once の代わりに include_once に移行するほど重要ではありませんでした。

その違いは、 require_once が水中でより多くの作業を行う必要があるためだと常に思っていました。少なくとも 1 つの潜在的なエラーに備えて処理する必要があり、必要なファイルが存在しない場合はさらに多くのことを行う必要があります。

于 2008-10-16T19:08:40.487 に答える