Оптимизация Zend Framework - PullRequest
       24

Оптимизация Zend Framework

6 голосов
/ 17 января 2011

Я пытаюсь добиться максимальной производительности из своего приложения, использующего Zend Framework.

Я рассматриваю возможность использования Zend Server с включенным APC. Однако сначала мне нужно знать несколько вещей.

Есть ли какая-либо польза от использования Zend Server + Zend Framework или я должен просто использовать любую обычную систему для размещения этого?

1007 * Шамиль *

Ответы [ 5 ]

25 голосов
/ 18 января 2011

Мои советы по более быстрому ZF (попробуйте сверху вниз):

Оптимизация включающего пути

  • сначала Zend Path
  • Модели далее
  • отдых в конце

Использование PHP 5.5 с включенным OPCache [NEW]

  • Не могу не подчеркнуть этого достаточно
  • прибавка около 50%

Кэширование метаданных таблицы

  • должно быть кэшировано, даже если не требуется никакого другого кэширования
  • одна из наших характеристик приложения улучшилась на ~ 30% на сервере Oracle;)

Избранные viewHelpers по сравнению с использованием action () помощник вида

  • создать помощник вида, который обращается к вашей модели
  • или только проходданные из модели и форматируйте их с помощью помощников вида

Используйте автозагрузчик classmap

  • , поскольку ZF1.11
  • предпочтительно с раздельными вызовами require_once

Минимизация стеков путей

  • В элементах формы ZF
    • много элементов
    • справка по просмотруers
    • помощники действий
  • каждый поиск стека путей означает вызов статов = потеря производительности
  • классы по умолчанию становятся все дороже с каждым путем в стеке

Обрезать require_once

Favor render () over частично () помощник вида

  • новый экземпляр вида не создается
  • вам необходимо установить переменные вне области визуализированного представления, внутри основного представления!
  • Вы также можете заменить partLoop () на foreach + render ()

Кэшировать все, что возможно

  • маленькие куски, которые требуютмного работы и редко меняются (например, динамические меню)
  • используйте профилировщик, чтобы найти низко висящий фрукт
    • то, что вы думаете, медленно, может и не так медленно
  • кэшировать все, что может иметь статический кэш
    • см. Руководство - Zend_Locale::setCache(), Zend_Currency::setCache(), Zend_Db_Table::setDefaultMetadataCache(), configs...

Никогда не использовать помощник вида action () или помощник действия actionStack ()

  • Никогда не используйте их, если не требуется 100% - например, для сложного вывода данных, но учтите потерю производительности, которую они представляют
  • Они создают совершенно новый цикл диспетчеризации и снижают производительность!

Отключить viewRenderer

Попробуйте мой плагин для суперлимунальной связи

  • он объединяет включенные классы в один длинный файл, чтобы минимизировать статистические вызовы
  • получить, если из GitHub
    • это порт из версия ZF2 из EDP
    • но будьте осторожны - он еще не тестировался в производстве, используйте с осторожностью
  • измерьте прирост производительности

Сокращение файлов на стороне сервера

  • Это имеет смысл для действительно больших файлов - жесткий диск всегда является узким местом
  • Даже микрооптимизация иногда работает нормально
    • карта классов со всемиПути классов ZF ОГРОМНЫ, зачеркивая пробелы и заменяя длинные переменные на $a и $b, что принесло выигрыш в производительности при "сухом" кеше кода операции и жестком диске под давлением.

Любой кэш кода операции обязательно должен быть;) (APC, ZendOptimizer и т. Д.)

3 голосов
/ 17 января 2011

APC поможет независимо от того, на каком стеке вы работаете. Любое кэширование OPcode будет.

С точки зрения ускорения вашего приложения, первым шагом является его профилирование. Используйте Xdebug для генерации отчета cachegrind, а затем используйте что-то вроде kcachegrind или webgrind для его интерпретации.

При работе с Zend Framework я нахожу некоторые болевые точки:

  • Конфиг-файлы довольно интенсивны для вычисления. как только у вас будет последний объект конфигурации, кешируйте его!
  • Включение файлов действительно дорого, попробуйте и сведите их к минимуму. Если вы часто открываете файлы для размышлений, кэшируйте вывод там.
  • Вызовы из базы данных могут быть дорогими, но, как правило, не являются медведями в комнате, если они не являются центральными задачами.

Кэширование на уровне страницы очень поможет. Везде, где вам не нужны свежие данные, кешируйте их.

В прошлом эта проблема не была связана с Zend Framework или сервером, и она стала архитектурной по своему характеру. Можете ли вы выполнять интенсивные задачи асинхронно? Иногда не стоит что-то оптимизировать, но стоит изменить восприятие пользователя, чтобы чувствовать себя быстрее.

Забавная мысль, на днях я отступил над $ i ++, чтобы заменить его на ++ $ i. Технически это быстрее, но я уверен, что время, которое у меня ушло на это, никогда не будет восстановлено при жизни программ. Вы должны нарисовать линию где-нибудь:)

1 голос
/ 17 января 2011

Кэширование кода операции - это то расширение, которое вы всегда хотите использовать при работе PHP в рабочей среде.Apc является расширением кэширования кода операции и данных, но на Zend-сервере основное кэширование кода операции называется «Оптимизатор плюс», и я рекомендую сравнить производительность между двумя, прежде чем принять решение использовать APC.В Zend-сервере есть еще одно расширение, которое выполняет кеширование данных.Многие файловые включения (как в Zend Framework) больше не являются проблемой с кэшированием кода операции, так как они хранятся скомпилированными в памяти, и больше не требуется много времени, чтобы начать их использовать.достигается с помощью полной (платной) версии Zend-сервера с помощью мониторинга PHP в сочетании с трассировкой кода, которая дает ценную информацию о проблемах и неоптимизированном коде в вашем приложении.С помощью этой комбинации очень быстро можно решить такие проблемы, как длинные сценарии и выполнение функций, длинные запросы к БД и многое другое.

1 голос
/ 17 января 2011

Zend Server - это очень общий PHP-компилятор (P из стека LAM P или WAM P ), хотя и гораздо более продвинутый, дает вам хороший графический интерфейс для установки всего (вместо этого редактирование php.ini), но что еще импортировано:

  • APC
  • Кэш (данные на уровне страницы)
  • Поиск работы
  • Расширенный мониторинг с отладкой

Если вы ищете APC, возможно, другие решения (о которых я пока не знаю) могут быть дешевле, но вам нужно, чтобы APC предпочел кеширование и запрос на работу ... Я люблю это.

Zend Framework не нужен для его использования, но вы можете использовать любой фреймворк (или без него).

Приятно, что вы можете попробовать полнофункциональную ZS бесплатно в течение 30 дней (APC недоступен в CE ---- >>>> неправильный APC доступен в CE)

0 голосов
/ 05 апреля 2019

Источник Этот совет не нов. Он взят непосредственно из документации Zend Framework по адресу: Руководство по производительности Zend Framework , и я использовал то, что было написано, с несколькими вещами, которые я пропустил.

Используйте Zend_Loader и удалите все require_once

На самом деле мы не можем удалить все операторы require_once. У нас должен быть хотя бы один require_once для загрузки Zend_Loader. Сначала активируйте Zend Loader.

require_once 'Zend/Loader.php';
Zend_Loader::registerAutoload();

Далее будет удаление всех операторов require_once для всех файлов в каталоге Zend. Если вы используете Eclipse PDT, вы можете использовать функцию поиска и замены.

Кэшировать метаданные Zend_Db_Table с Zend_Cache

Когда вы используете Zend_Db_Table (я иногда использовал только Zend_Db), вы заметите, что, когда вы пытаетесь получить данные из базы данных, первый запрос называется DESCRIBE таблицы. Zend_Db_Table использует информацию о запросе DESCRIBE, чтобы применить магию к SELECT.

Поскольку я профилировал свои запросы, я заметил, что запрос DESCRIBE является самым длинным (в большинстве случаев) запросом, что означает большие накладные расходы на операцию поиска. У вас есть два варианта:

(A) Не используйте Zend_Db_Table (перейдите на Zend_Db) (B) Кэшировать метаданные

В этом посте я буду использовать кеширование метаданных. В файл начальной загрузки поместите этот фрагмент кода:

//Caching
$frontendOptions = array(
                    'lifetime'                  => 25200,
                    'automatic_serialization'   => true
                    );
$backendOptions  = array(
                     'cache_dir'                => APPLICATION_PATH . '/tmp'
                    );          
$cache = Zend_Cache::factory(
                    'Core',
                    'File',
                    $frontendOptions,
                    $backendOptions
                    );
//Cache table metadata
Zend_Db_Table_Abstract::setDefaultMetadataCache($cache);

Файл класса загрузчика плагина кэша

При использовании плагина Zend Framework включает несколько файлов в зависимости от используемого плагина и обрабатывает несколько итераций, чтобы найти нужный плагин и включить его. С кодом кода ниже, он создает список операторов include_once для включения этих файлов плагинов. Просто включите этот кусок кода в ваш загрузчик.

//Plugin Loader caching
$classFileIncCache = APPLICATION_PATH .  '/data/pluginLoaderCache.php';
if (file_exists($classFileIncCache)) {
    include_once $classFileIncCache;
}
Zend_Loader_PluginLoader::setIncludeFileCache($classFileIncCache);

Кэширование ваших данных

Кэширование ваших данных будет наиболее важной частью оптимизации, которая сохранит вам большой доступ к базе данных, когда кешированные данные уже доступны. Важно установить время истечения срока действия кеша, а также очистить кеш при изменении данных. Простое кеширование показано ниже.

На вашей начальной загрузке:

//Caching
$frontendOptions = array(
                    'lifetime'                  => 25200,
                    'automatic_serialization'   => true
                    );
$backendOptions  = array(
                     'cache_dir'                => APPLICATION_PATH . '/tmp'
                    );          
$cache = Zend_Cache::factory(
                    'Core',
                    'File',
                    $frontendOptions,
                    $backendOptions
                    );

$registry->set('cache', $dbCache);

Это основные настройки, которые могут мне помочь.

...