我不确定如何处理。在我的应用程序(Zend Framework,MySQL,jQuery)中,其中一个页面需要10秒钟才能加载。
它从数据库中加载了400个记录,因此我认为瓶颈不在MySQL中。当然,相关表上的服务器端选择不是问题:
379 rows in set (0.00 sec)
firebug报告了在原始请求中等待服务器响应的延迟,即" 0 ---> 11.09s等待"。这是第一个请求,所有jQuery代码之后将加载,撞击时间为11.54。因此,jQuery似乎也不是瓶颈。
没有其他控制器/动作几乎需要这么长时间来做出响应,所以我无法想象这是一个apache问题。留下ZF本身。
我想知道是否有一种方法可以测试延迟发生的位置。这是相关动作的全文:
public function listAction()
{
$userDepts = new Application_Model_DbTable_UserDepartments;
$ptcpDepts = new Application_Model_DbTable_ParticipantDepts;
$participants = new Application_Model_DbTable_Participants;
$depts = new Application_Model_DbTable_Depts;
$ptcpAlerts = new Application_Model_DbTable_AlertsParticipants;
//check if sub-list is being passed
if ($this->_helper->flashMessenger->getMessages()) {
$passedList = $this->_helper->flashMessenger->getMessages();
$list = $passedList['0'];
} else {
$list = $participants->getStaffPtcps();
}
$goodList = array_unique($list);
$number = count($goodList);
$content = array();
foreach ($goodList as $id) {
$deptNames = array();
$ptcpInfo = $participants->getRecord($id);
$ptcpDept = $ptcpDepts->getList('depts', $id);
$flags = $ptcpAlerts->getPtcpAlerts($id);
if (count($flags) > 0) {
$flagTest = TRUE;
} else {
$flagTest = FALSE;
}
foreach ($ptcpDept as $did) {
$deptName = $depts->getDept($did);
$deptNames[$did] = $deptName['deptName'];
}
$content[$id] = $ptcpInfo;
$content[$id]['depts'] = $deptNames;
$content[$id]['flag'] = $flagTest;
}
foreach ($content as $c => $key) {
$sortLastName[] = $key['lastName'];
}
array_multisort($sortLastName, SORT_ASC, $content);
$this->view->list = $content;
$this->view->count = $number;
$this->view->layout()->customJS =
'<script type="text/javascript" src="/js/datePicker.js"></script>' .
'<script type="text/javascript" src="/js/ptcpCreate.js"></script>' .
'<script type="text/javascript" src="/js/editDataWithModal.js"></script>' .
'<script type="text/javascript" src="/js/filter.js"></script>';
$form = new Application_Form_AddParticipant;
$this->view->form = $form;
}
关于优化此代码的任何想法 - 或其他要查找的指示 - 将不胜感激!
好吧,我不知道您的自定义方法在做什么,但我会假设您做一个音调od od db呼叫:
-
$participants->getStaffPtcps();
获取Inital列表 - 然后,对于每个伴随您:
- 获取完整记录
- 获取部门的相关列表(
$ptcpDepts->getList('depts', $id)
) - 前部部门您获取更多数据
如果这是正确的,那么您实际上正在运行大量查询,具体取决于员工参与者和部门返回的记录。除非您专门将其关闭,否则每次运行此记录的保湿对象都要多。在很多情况下,这将使事情变得非常慢,您可能只能在几个与JONINS的疑问中进行此操作,但我必须更多地了解DB模式以及您的方法正在做什么才能告诉您如何。
您还可以确保您完全绕过zend_db_table_row和zend_db_table_rowset。