#performance #zend-framework #loading
#Производительность #zend-framework #Загрузка
Вопрос:
Я разработал приложение с использованием ZF.Приложение немного велико и обладает множеством функций.
Я использую Zend_Application (уже использую автозагрузчик в конструкторе), Zend_Layout, Zend_view, Zend_form и т.д. Моя текущая проблема в том, что загрузка страницы происходит очень медленно, и это тоже на localhost с XAMP.
Я включил xdebug, чтобы исследовать проблему, получил файл cachegrind в папке «tmp» и попытался просмотреть его с помощью программного обеспечения WinCacheGrind. Там я вижу множество процессов и функций, запускаемых при каждом запросе или загрузке страницы.
Кроме того, я установил надстройку YSlow для Firefox и наблюдал за скоростью загрузки страницы в секундах…Я сравнил скорость с приложениями ZF и не ZF. И из сравнения, загрузка страниц для приложений, отличных от zf, занимает менее 1 секунды, а для приложения ZF это занимает по крайней мере 6-7 секунд. Какая огромная разница.
В приложении происходят следующие основные вещи :
1) Подключение к базе данных происходит для каждого запроса.
2) Я не добавляю view в layout явно, ZF просто добавляет его автоматически в layout.phtml на основе названия действия.
3) В некоторых окнах есть формы с несколькими выпадающими списками, которые извлекают данные из базы данных.
4) Внедрены меню с ACL, раньше оно загружало привилегии из базы данных для каждого запроса, но теперь я оптимизировал его, так что оно будет работать только при входе в систему, а остальное время потребуется из Zend_Registry.
Я хотел бы прикрепить файл cachegrind, чтобы кто-нибудь мог видеть, что происходит в фоновом режиме, но я не вижу здесь опции для прикрепления.
Кто-нибудь, пожалуйста, помогите мне найти решение для этого. Мы действительно ценим любую помощь. Большое спасибо
Комментарии:
1. Знаете ли вы, сколько времени загрузки уходит на выполнение запросов к базе данных? Взгляните на профилировщик БД — framework.zend.com/manual/en/zend.db.profiler.html
2. Можете ли вы где-нибудь сослаться на файл cachegrind? Или даже скриншот, чтобы дать людям общее представление. В противном случае мы никак не сможем определить, в чем настоящая проблема.
3. да, конечно .. я загружу это куда-нибудь … annd даст вам ссылку..
4. @tim я также запустил результаты zend_db_profiler для firebug … есть запросы с заполнителями и другие необходимые запросы для страниц… все вместе составляет менее 1 мс … для большинства страниц…
5. @Ryan Вот ссылка на файл cachegrind southkeralaprovinceocd.com/cachegrind.out.2904
Ответ №1:
Давайте попробуем дать несколько советов.
Первое подключение к базе данных должно произойти только один раз (за исключением случаев, когда вы используете несколько привилегий доступа к базе данных или нескольким базам данных). Поэтому убедитесь, что вы используете одноэлементные шаблоны с вашим объектом Zend_Db_Tables
Тогда вы не используете Zend_Cache. Вам действительно следует начать использовать Zend_Cache и создать несколько объектов кэша. Допустим, например, файловый кэш с долговременным хранением и кэш memcache или Apc Cache для хранения объектов. Затем используйте этот кэш в нескольких слоях:
- присваивает файловый кэш Zend_Db_Table (defaultMetaDataCache по умолчанию), таким образом, вы избежите кучи запросов метаданных, запросов, которые запрашивают описание каждого столбца используемых вами таблиц.
- Сохраните один или несколько объектов Acl (зависит от того, как вы используете Acl, есть ли у вас один большой Acl со всеми правилами или несколько с подмножествами). И хранить их в промежуточных кэшах при их сборке.
- Подумайте о других вариантах использования, обнаружьте тяжелые циклы, полустатическое содержимое (например, вы выбираете списки, сколько раз их следует считать статичными?)
Наконец, получите целостное представление о том, как работает движок вашего приложения, и как ваши данные будут расти и использоваться.Вам понадобится этот шаг, чтобы наилучшим образом использовать кэши уровней приложения (например, следует ли кэшировать некоторые элементы для групп пользователей?, должны ли объекты Acl создаваться для групп, для каждого пользователя, для всех, есть ли какие-то блоки в макете, которые должны отображаться одинаково для всех?).
Комментарии:
1. привет, регилеро, большое тебе спасибо за твой ответ. Прежде всего, приложение будет работать через vpn, где не будет много пользователей в Сети одновременно .. оно не открыто для публики. Таким образом, мы можем предположить ограничение пользователей. Во-вторых, некоторые таблицы в базе данных будут увеличиваться в размерах на ходу. Кроме того, ACL, как только пользователь войдет в систему, у него будут определенные меню, к которым он сможет получить доступ, но также у него не будет доступа к определенной ссылке в меню, которое ему разрешено access..so структура приложения выглядит следующим образом … и если есть кэш для некоторых страниц, в основном для форм, кэш может быть очень полезен. Как насчет eAccelerator
2. Я говорю об использовании кэша в вашем приложении для объектов, загружаемых вашим приложением, а не только о кэшировании конечных страниц. Например, вы создаете объект ACL для каждого пользователя со всеми его правилами и сохраняете этот объект, чтобы не перестраивать его каждый раз. Для кода операции посмотрите на APC, так как он также предоставит вам серверную часть кэша.
3. Привет, regilero,ok…Im планирование кэширования объектов, как вы сказали… проверим разницу в производительности. Кроме того, по вашему мнению, что все остальные области, которые мне нужно проверить … иногда я вижу задержку в рендеринге представления. Ваша информация была полезной. И, надеюсь, вы видели файл cachegrind … там вызывается множество функций… что заставляет меня больше беспокоиться… в любом случае, позвольте мне попробовать с методами кэширования. Zend_Cache был бы правильным выбором, верно…
4. Да, я видел cachegrind, и это наводит меня на мысль, что у вас нет большой проблемы, но много вызовов во многих слоях, поэтому, используя кэши, вы избежите перестроения многих из этих вызовов. Задержки при отображении вида иногда возникают из-за Zend Form, формы с большим количеством элементов формы (около 50-100) могут быть очень длинными, по моему опыту, из-за управления плагинами декораторов, подумайте о ViewScript helper для больших форм.