2013-10-20 11 views
8

Zend Framework 2の工場クラスやクロージャーを使用する方が良いでしょうか?工場クラスとZend Framework 2のクロージャー

クロージャはシリアル化できないことは知っていますが、モジュール#getServiceConfig()から返すと、残りのコンフィグレーションデータのキャッシュには影響しませんし、クロージャはオペコードキャッシュにキャッシュされます。

ファクトリクラスの作成とクロージャの実行のパフォーマンスはどのように異なりますか? PHPは、実行時にのみクロージャをラップしてインスタンス化しますか、またはリクエストごとに設定ファイルで定義されたクロージャごとにこれを実行しますか?

誰も各メソッドの実行時間を比較しましたか?

参照:それはすべてのリクエストでこれを行うだろうので、PHPをコンパイル時に閉鎖クラスのインスタンスにコンフィギュレーションで無名関数を変換します

答えて

11

。これは、実行時に関数を作成するcreate_functionとは異なります。しかし、クロージャはコンパイル時にこれを行うので、opcacheキャッシュに格納する必要があります。したがって、問題ではありません。

ファクトリとクロージャを使用してサービスを構築することによるパフォーマンスの影響については、最初に、サービスを要求した回数にかかわらず、要求ごとに1回しかサービスが構築されないことを覚えておく必要があります。私は(私は数回を実行し、結果のすべてがほぼ同じ値だった)の閉鎖、工場を使用してサービスをフェッチするの迅速なベンチマークを実行し、ここで私が得たものである:

Closure: 0.026999999999999ns 
Factory: 0.30200000000002ns 

は、それらはナノ秒です、すなわち、1-9秒。基本的にパフォーマンスの差は小さいので効果的な違いはありません。

また、ZF2では、モジュール全体の構成をクロージャでキャッシュできません。私が純粋に工場を使用する場合、私の全体の構成をマージし、キャッシュし、毎回構成ファイルをロードしてマージすることを心配するのではなく、各要求に対して単純なファイルを読むことができます。私はこれのパフォーマンスの影響を測定していないが、私はそれがどんな場合でも限界があると思うだろう。

しかし、私は主に読みやすさと保守性のための工場を好んでいます。ファクトリを使用すると、大量のコンフィギュレーションファイルで終わることはありません。

確かに、クロージャは迅速な開発には最適ですが、コードを読みやすく保守したい場合は、工場に固執するといいでしょう。

+2

キャッシングに関すること:クロージャ付きのものは全て、あなたのModule-Classの 'getXyzConfig()'の中に入るべきです。 'module.config.php'の中でnon-closure-configのみです;) – Sam

+0

すばらしい答えです、感謝します。 – darkangel

+2

クロージャはすべてのリクエストで作成されますが、ファクトリクラスは、その背後にあるサービスが実際に必要な場合にのみインスタンス化されます。 – DASPRiD