2011-11-23 13 views
8

現在、自分のサイトのすべてのページに「all.inc.php」ファイルを含めることですべてのクラスを読み込みます。このファイルには、すべての設定、クラス、関数などが含まれています。サイト全体。PHPでオートローディングクラスを使用しているときにパフォーマンスの低下がありますか?

私の問題は、ウェブサイトの特定のページ/セクションのみに関連するクラスを使用することが多いため、使用されないページの先頭にクラスをたくさん入れていることです。

明らかにこのクラスをオートロードするとこの問題が解決されるはずです。私の質問は、クラスが自動的にロードされるので、サーバーがファイルが存在するかどうかをチェックする必要があります。欠点がある場合は、ページ上で使用されないかもしれない多数のクラスを含める必要があるよりも悪いことでしょうか?あるいは違いは否定できないのですか?

答えて

9

この記事にはいくつかの情報とベンチマークがあります:PHP autoload performance結論:

自動ロードはパフォーマンスを大幅に低下させません。 Include_pathの参照、ディスクからのPHPスクリプトの読み込みと解析では、裸の自動ロードロジックのコストよりもはるかに長い時間がかかります。

+0

ありがとう、その記事は私が探していた種類の説明でした! – Nick

+0

短い答え:本当に(それは小さなパフォーマンスヒットです)、いいえ、はい: – siliconrockstar

5

クラスの自動ロードは、通常の方法でクラスを含むほど高速です。自動ローディングに切り替えると、PHPがファイルやクラスを少なくロードするため、ケースのパフォーマンスが向上します。

+3

このエートは正しいが、コードベースによって異なる。コードベースが緊密に結合されていて、クラスが互いに依存している場合、クラスの大半(またはすべて)がロードされる可能性があるため、オートローディングには何のメリットもありません。ただの考え;-) –

1

include()require()(およびその_once兄弟)は、独自のパフォーマンスペナルティを運びます。ディスクのシークとリードもコストがかかります。あなたのコードに依存しますが、20のクラスをロードしていて、1つのポイントで2つまたは3つしか使用していない場合は、オートロードのルートに行く価値があります。

パフォーマンスが最も重視される場合は、クラスファイルを1つのファイルにマージして、必要なものをインスタンス化する必要があります。

+2

クラスのトンを1つのファイルに投げるのはかなり悪い習慣です。 – burzum

+0

@burzumなぜそれがありますか? –

+0

http://en.wikipedia.org/wiki/Separation_of_concerns – burzum

3

スクリプトがファイルシステムで毎回ファイルを検索する必要がない場合、オートローディングによりパフォーマンスが向上します。名前空間を使用する場合は、名前空間とクラス名をフォルダにマッピングし、Some/Nice/ClassNameのようなファイルをSome/Nice/ClassName.phpにマッピングします。

あなたが名前空間を使用して、私はあなたが同じような何かを行うことができますファイル含めるカスタムシングルトンクラスを作成することをお勧めフォルダを検索する必要がない場合:

アプリケーションを::用途(「一部/ニース」 、 'クラス名');

Autoloadでは、登録されたパスとクラス名を使用して、この例のusesメソッドの両方の引数を組み合わせたパスとファイルにマップします。これにより、名前空間を使用するようにアプリケーションを変更する準備が整うまで、クラスローディングのような名前空間を使用できます。

2

プロジェクト内の使用可能なすべてのクラス/ファイルのキャッシュインデックスで自動ロードを使用する必要があります。

例:

$class_cache=array(
    'MyClass'=>'lib/MyClass.php', 
    'Item'=>'model/Item.php' 
); 

function __autoload($class_name) { 
if(array_key_exists($class_name)) 
    include $class_cache[$class_name]; 
else 
    throw new Exception("Unable to load $class_name."); 
} 

あなたは実際のクラスのリストを維持するか、$ class_cacheのためのいくつかの発電機を記述する必要があります。

+0

サンプルコードをありがとうが、すべてのクラスは同じ命名規則に従い、クラス名を使用して簡単に一致するので、一致させる配列は最適な解決策だとは思わない。私は今、私はオートロードを使用するつもりだと確信しています!説明のためにあなた(そして他人)に感謝します。 – Nick

+0

しかし、$ class_cacheにauto-generatorを記述してデプロイする前に実行すると、利用可能なPHPファイルは、すべてのリクエストではなく、デプロイ時に一度だけチェックされます。 – rogal111

関連する問題