web-dev-qa-db-ja.com

高トラフィックのためのZF2最適化

4人以上のユーザーが同時に使用していると、ZF2アプリケーションが非常に遅くなるようです。

Xdebugとwebgrindを使用してコードのプロファイルを作成しましたが、私の関数以外は遅いようですので、zf2内での最適化の問題でなければなりません。

EvanDotProによるEdpSuperluminalモジュールを使用するキャッシュの場合、これによりアプリケーションのパフォーマンスが向上するようです。

Nginxリバースプロキシを使用しますが、意味がありません。

トラフィックが多い場合の応答を高めるには、いくつかの良いアドバイスが必要です。私は同時に30人以上の接続ユーザーについて話します。

31
directory

より高速なアプリケーションを実現するための非常に単純な手順はほとんどありません。常に考慮できることは3つあります。

  1. ZF2 Performance QuickTipp#1-ViewModels レンダリングする完全修飾スクリプトを常に手動で割り当てます。これにより、パフォーマンスが少し向上します。これは次のように行われます:

    public function someAction()
    {
        $viewModel = new ViewModel();
        $viewModel->setTemplate('MODULE / CONTROLLER / ACTION.phtml');
        // In this given example: $viewModel->setTemplate('foo/bar/some.phtml');
    
        // Do some other Controller-logic as used to
    
        return $viewModel->setVariables(array(
            //key-value-paired view-variables
        ));
    }
    
  2. ZF2 Performance QuickTipp#2-Classmap Autoloading これはおそらく、アプリケーションの高速化の最も重要な部分の1つです。個人的には、LoadingTimesが最大40%増加することを確認しました。これを実装するのはとても簡単です:

    class Module 
    {
        public function getAutoloaderConfig()
        {
            return array(
               'Zend\Loader\ClassMapAutoloader' => array(
                    __DIR__ . '/autoload_classmap.php',
               ),
            );
        }
    }
    

    autoload_classmap.phpは、'FQ-CLASSNAME' => 'FQ-FILEPATH'の単純な配列です。これはかなり簡単に自動化できます ZF2のclassmap_generator-utilityを使用

  3. ZF2 Performance QuickTipp#3-Module.phpを軽量に保つ!悲しいことに、これは私がまだ書いていない記事です。 Module.phpは、リクエストごとに読み込まれるファイルです。多くの人がこれを忘れて、たくさんの工場を書きます。ある時点で、 ZfcUser-Module.php は、すべきでないことの例でした。クロージャまたは匿名関数もすべてのリクエストで実行されます。プロジェクト全体でその数が多すぎる場合、これはかなりの作業になります。より良いアプローチは、単にFactory-Classesと書くことです。 ZfcUser後で pdated Module.php この戦略を使用します。

そして、それは人ができる簡単なことのほとんどすべてです(私は知っています-私はあまり知りません!:D)。ただし、興味深いことに、3人のユーザーを使い始めると、アプリケーションの実行が遅くなります。私の経験では、これはスクリプト自体とは関係ありませんが、サーバーの問題です。これはステージングマシンからですか、それともローカルですか?

43
Sam

Doctrineを使用している場合は、アノテーションのキャッシュを追加することを忘れないでください。これにより、パフォーマンスが大幅に向上します(このキャッシュをアクティブ化すると、読み込み時間をほぼ2で割ります)。 DoctrineORMModuleを使用している場合:

'doctrine' => array(
    'driver' => array(

        'cache' => array(
            'class' => 'Doctrine\Common\Cache\ApcCache'
        ),

        'configuration' => array(
            'orm_default' => array(
                'metadata_cache' => 'apc',
                'query_cache'    => 'apc',
                'result_cache'   => 'apc'
            )
        ),
    )
)

ただし、マッピングが変更されるたびにキャッシュをクリアする必要があるため、開発中は非常に不便です。

29
Michael Gallego

zF2クラスマップジェネレーターは、大規模なプロジェクトの場合に大きな効果を発揮します。

http://framework.zend.com/manual/2.0/en/modules/zend.loader.classmap-generator.html

または、composer(使用する必要があります)を使用している場合は、composerを使用して、すべてのモジュールと依存関係のクラスマップを生成することもできます。

php composer.phar install --optimize-autoloader

php composer.phar update --optimize-autoloader
27
Andrew

上記のすべてと、APC/Opcacheのようなある種のオペコードキャッシングを使用すると、処理速度が向上します。しかし、はい、ZF 2は非常に遅いようですが、残念ながらZF 1 :(

また、モジュールの構成キャッシュにより処理速度が向上しますが、これを機能させるためにクロージャーを使用することはできません;)

http://hounddog.github.io/blog/performance-in-zend-framework-2/

3
Chris

まず、zf2アプリケーションを高速化するには、ZendOptimizerPlusを使用する必要があります。 PHPコードの読み取りとプリコンパイルに使用される実行時間の大部分。典型的なZF2アプリには多くのファイルがあるため、それらを処理するのに長い時間がかかります。

ZendOp +は、phpアプリケーションのバイトコードを共有メモリに保存するため、サーバーは多くのファイルを読み取ったり、リクエストごとに解析したりしません。 ZendOp +はデフォルトでphp5.5になるので、それを知って使用すると便利です。

ベンチマークにより、単純なフレームワークアプリケーションのパフォーマンスが9倍向上します(symfony2テスト- http://www.ricardclau.com/2013/03/apc-vs-zend-optimizer-benchmarks-with-symfony2/ ) 。

私のzf2 + doctrine2 + zfcUserアプリケーションに使用します。 Memcachedはdoctrine2の目的で使用され、パフォーマンスの向上は約5%にすぎません。 ZendOp +を使用すると、単純なページの場合は6倍(0.2-> 0.03s)、フォーム、エンティティ、ビューの多い複雑なページの場合は3倍(0.2-0.06)増加します。クラスマップジェネレーターを使用している場合は、回答を更新します。

もう1つの問題は、Apache2 +モジュールではなくnginx + php-fpmを使用することです。サーバーのリソースを節約します。

2
shukshin.ivan