31

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

xdebug と webgrind を使用してコードをプロファイリングしましたが、どの機能も遅いように見えるため、zf2 内での最適化の問題である必要があります。

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

nginx リバース プロキシを利用していますが、同様に意味がありません。

トラフィックが多い場合のレスポンスを向上させるための適切なアドバイスが必要です。同時に 30 人以上の接続ユーザーについて話します。

4

5 に答える 5

43

より高速なアプリケーションを実現するための非常に簡単な手順がいくつかあります。常に考えられることが 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 - クラスマップの自動ロード これはおそらく、アプリケーションを高速化する上で最も重要な部分の 1 つです。個人的には、LoadingTimes が最大 40% 増加しました。これを実装するのはとても簡単です:

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

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

  3. ZF2 パフォーマンスのクイックヒント #3 - Module.php を軽量に保ちます。悲しいことに、これはまだ書きに来ていない投稿です。はModule.php、リクエストごとにロードされるファイルです。多くの人がこれを忘れて、その中にたくさんの工場を書いています。ある時点で、ZfcUser-Module.phpはすべきでないことの例でした。クロージャまたは無名関数もすべてのリクエストで実行されます。プロジェクト全体でそれらが多すぎる場合、これはかなりの作業になります。より良いアプローチは、単純にFactory-Classesを記述することです。ZfcUser は後でこの戦略を使用するようにModule.php を更新しました。

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

于 2013-02-03T12:28:09.670 に答える
29

Doctrine を使用している場合は、注釈用のキャッシュを追加することを忘れないでください。これにより、パフォーマンスが大幅に向上します (このキャッシュを有効にすると、読み込み時間がほぼ 2 分の 1 になります)。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'
            )
        ),
    )
)

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

于 2013-05-11T18:42:32.367 に答える
27

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
于 2013-02-08T16:25:47.167 に答える
3

All of the above and using some kind of opcode caching like APC / Opcache it will speed things up. But yes ZF 2 seems to be very slow unfortunately even more slow then ZF 1 :(

Also the module config cache speeds things up, you cannot have any closures though to make this working ;)

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

于 2013-08-05T19:01:20.740 に答える
2

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

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

Benchmarks は、単純なフレームワーク アプリケーションのパフォーマンスを 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.03 秒) 増加し、多くのフォーム、エンティティ、ビューを含む複雑なページでは 3 倍 (0.2 - 0.06) 増加しました。クラスマップジェネレーターを使用する場合は、回答を更新します。

別の問題は、apache2+module ではなく nginx + php-fpm を使用することです。サーバーリソースを節約します。

于 2014-04-17T21:12:38.747 に答える