Подтвердить что ты не робот

ZF2 Оптимизация для высокого трафика

Мое приложение ZF2 кажется чрезвычайно медленным, когда более 3 пользователей используют его в то же время.

Я просматриваю свой код с помощью xdebug и webgrind, а не мои функции, кажется, медленны поэтому он должен быть проблемой оптимизации в пределах zf2, который он сам.

Для кеша я использую модуль EdpSuperluminal от EvanDotPro, это, по-видимому, увеличивает производительность приложения.

Мы используем обратный прокси nginx, но не имеем никакого смысла.

Мне нужны хорошие советы, чтобы увеличить ответ на высокий трафик. Я говорю о 30+ подключенных пользователей.

4b9b3361

Ответ 1

Несколько простых шагов для достижения более быстрого приложения. Там всегда можно рассмотреть три вещи.

  • Производительность ZF2 QuickTip # 1 - ViewModels Всегда вручную назначать полностью подготовленный script для рендеринга. Это немного увеличит производительность. Это было сделано так:

    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
        ));
    }
    
  • Производительность ZF2 QuickTipp # 2 - Classmap Autoloading Вероятно, это одна из самых важных частей ускорения вашего приложения. Лично я видел увеличение LoadingTimes на 40%. Реализация этого довольно проста:

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

    Затем autoload_classmap.php представляет собой простой массив 'FQ-CLASSNAME' => 'FQ-FILEPATH'. Это можно легко автоматизировать с помощью утилиты classmap_generator ZF2

  • Производительность ZF2 QuickTipp # 3 - Освободите модуль Module.php! К сожалению, это сообщение, о котором я еще не писал. Module.php - это файл, загружаемый для каждого отдельного запроса. Многие люди забывают об этом и пишут множество и множество фабрик внутри них. В какой-то момент ZfcUser-Module.php был примером того, что не делать. Завершения или анонимные функции выполняются по каждому запросу. Это довольно много предстоит сделать, если их слишком много по всему проекту. Лучшим подходом было бы просто написать Factory -Classes. ZfcUser позже обновленный Module.php, чтобы использовать эту стратегию.

И это почти все легкие вещи, которые можно сделать (о которых я знаю - я не знаю много!: D). Однако интересно то, что для начала использования трех пользователей ваше приложение работает медленно. По моему опыту, это не имеет никакого отношения к самим сценариям, а скорее к проблеме с сервером. Это из промежуточной машины или локально?

Ответ 2

Если вы используете Doctrine, не забудьте добавить кэш для аннотаций. Это значительно повышает производительность (когда я активирую этот кеш, я делю почти на два раза время загрузки). Если вы используете 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'
            )
        ),
    )
)

Тем не менее, это довольно неудобно при разработке, потому что вы должны очищать кеш всякий раз, когда меняется ваше сопоставление.

Ответ 3

генератор классов ZF2 даст вам большой импульс, если у вас большой проект:

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

В качестве альтернативы, если вы используете композитор (вы должны это сделать), вы можете использовать композитор для создания карты классов для всех ваших модулей и зависимостей, что еще лучше:

php composer.phar install --optimize-autoloader

php composer.phar update --optimize-autoloader

Ответ 4

Все вышесказанное и использование какого-то кэширования кода операции, такого как APC/Opcache, ускорит процесс. Но да ZF 2, кажется, очень медленный, к сожалению, еще медленнее, чем ZF 1: (

Кроме того, кеш конфигурации модуля ускоряет работу, у вас не может быть никаких закрытий, но чтобы это работало;)

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

Ответ 5

Прежде всего, чтобы ускорить приложение zf2, вы должны использовать ZendOptimizerPlus. Огромная часть времени выполнения используется для чтения и прекомпиляции PHP-кода. Типичное приложение ZF2 содержит много файлов, поэтому для их обработки требуется много времени.

ZendOp + сохраняет байт-код вашего приложения php в общей памяти, поэтому сервер не читает много файлов и не анализирует его каждый запрос. По умолчанию ZendOp + будет по php5.5, поэтому полезно знать его и использовать.

Benchmarks дает 9-кратное увеличение производительности для простых приложений framework (тесты 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) для сложных страниц с большим количеством форм, сущностей, просмотров. Если я использую генератор классов, я обновлю ответ.

Другая проблема - использовать nginx + php-fpm, а не модуль apache2+. Он сохраняет ресурсы сервера.