2014-01-28 2 views
3

У меня есть приложение cakephp, 2.4, и у меня возникают проблемы с компонентом Paginator. Во-первых, это не база данных, это, безусловно, выполнение анализа результатов запроса. У меня установлен DebugKit и я вижу, что мой запрос mysql для разбитых на страницы данных занимает всего 2 мс. В таблице содержится 2,5 миллиона записей сообщений и 500 000 пользователей. Очевидно, что правильная индексация на месте. Но действие контроллера составляет 6167,82 мс. Итак, вот мое действие контроллера:cakephp paginator чрезвычайно медленный

$this->Paginator->settings = array(
    'Message' => array(
    'fields' => array(
     'Recipient.username', 
     'Recipient.profile_photo', 
     'Recipient.id', 
     'Message.*' 
    ), 
    'joins' => array(array(
     'table' => 'users', 
     'alias' => 'Recipient', 
     'type' => 'LEFT', 
     'conditions' => array(
     'Recipient.id = `Message`.`recipient_id`' 
    ) 
    )), 
     'conditions' => array( 
     'Message.sender_id' => $this->Auth->user('id'), 
     'Message.deleted_by_sender' => '0' 
    ), 
    'limit' => 10, 
    'order' => 'Message.id DESC', 
    'recursive' => -1 
) 
); 
$sents = $this->Paginator->paginate('Message'); 
$this->set('sents', $sents); 
$this->view = 'index'; 

Я искал эту страницу и искал переполнение стека. Большинство ответов относятся к плохой оптимизации mysql, что не является моим делом. Другая половина ответов кажется сдерживаемой. Итак, я попытался сдержать. Использование содержимого было на самом деле медленнее, потому что оно пыталось захватить еще больше данных из поля пользователя, чем просто имя пользователя, фотографию и идентификатор. Затем, когда торт построил массив из результатов запроса, он выполнил почти 500 мс медленнее с возможностью скрыть из-за дополнительных пользовательских данных, которые я предполагаю.

Я собираюсь теперь выкопать компонент пирога Paginator и посмотреть, почему он так долго пытается построить ответ. Я надеюсь, что кто-то меня избивает, и у нас есть хорошее решение, чтобы ускорить это.

Мой веб-сервер работает с ubuntu 12.04 с 3-гигабайтным баком, apache и mod_php с установленным apc и работает для модели и кэш-памяти ядра. База данных находится на отдельном сервере. У меня также есть сервер redis, сохраняющий другие пользовательские данные и данные сеанса торта. Здесь много возможностей для анализа 10 записей из запроса mysql, содержащего около дюжины строк.

EDIT: ответ

Как было предложено первым Илие Pandia там было что-то еще происходит, например, обратный вызов, который был замедляя пагинацию. Это было фактически не связано с компонентом разбивки на страницы. Модель Получателя имела поведение, которое загрузило sdk в обратном вызове установки для сторонней службы. Эта служба занимала несколько секунд, чтобы ответить. Это произошло, когда связанныйМодель в запросе был загружен для фильтрации результатов. Надеюсь, что кто-либо еще ищет причины, по которым торт может плохо работать, также будет смотреть на обратные вызовы моделей в приложении и плагинах.

+0

ralationship - это просто сообщение принадлежит получателю или есть больше? – arilia

+0

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

+0

Я столкнулся с той же проблемой.Я предполагаю, что это потому, что компонент Paginator нуждается в общем счетчике и сначала делает запрос с 'WHERE 1 = 1', а затем разбивается на страницы в соответствии с' limit' – zeflex

ответ

0

Я не вижу причин для этого, чтобы он работал медленно.

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

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

Вы можете на самом деле measure the time вызова paginate, и я думаю, вы обнаружите, что он очень быстрый. Таким образом, горло бутылки находится в другом месте кода.

PS: Вы также можете попытаться отключить DebugKit некоторое время. Интроспекция может занять очень много времени для некоторых конкретных случаев.

+0

«У меня установлено DebugKit», второе предложение в моем вопросе. Этот код является полнотой действия контроллера. Я не писал все это, и там могут быть какие-то обратные вызовы, которые я не знаю. Я также проверю это и обновляю это. Спасибо – mneil

+0

Я заметил, что у вас установлен DebugKit и вы измеряете время запроса и действия. То, что я предлагал, - это вручную измерить время разбивки на страницы. Вы можете заметить, что это почти мгновенно, поэтому вы будете знать, что есть некоторые обратные вызовы. И попытайтесь отключить DebugKit для теста или два, посмотрите, как это происходит ... Я любопытно, что вы найдете! –

+0

(Я предлагаю это, потому что я не знаю, как DebugKit фактически измеряет время действия ... с обратными вызовами или без них?) –

0

Установите DebugKit для вашего приложения.

И проверьте, какой запрос занимает слишком много времени. Оттуда вы сможете отслеживать узкое место.

+0

Установлен DebugKit. Я бы это сделал, но у меня пока нет репутации. Запрос НЕ МЕДЛЕННЫЙ. 2мс. – mneil

Смежные вопросы