0

これにアプローチする方法がわかりません。私のアプリケーション (Zend Framework、MySQL、jQuery) では、ページの 1 つがロードに 10 秒以上かかっています。

データベースから 400 件未満のレコードをロードしているので、ボトルネックは MySQL にあるとは思いません。確かに、関連するテーブルでのサーバー側の選択は問題ではありません。

379 rows in set (0.00 sec)

Firebug は、元のリクエストでサーバーの応答を待機していると遅延を報告します。「0 ---> 11.09s Waiting」。これは最初のリクエストであり、その後すべての jQuery コードがロードされ、onLoad 時間は 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;        
}

このコードの最適化に関するアイデア、または他の場所を探すためのポインタを大歓迎します!

4

1 に答える 1

1

カスタムメソッドが何をしているのかはわかりませんが、db呼び出しの調子を整えていると思います:

  • $participants->getStaffPtcps();初期リストを取得する
  • 次に、参加者ごとに次のことを行います。
    • 完全な記録を取得する
    • $ptcpDepts->getList('depts', $id)部署の関連リスト ( ) を取得する
    • 部門ごとにさらに多くのデータを取得します

これが正しい場合、スタッフ参加者と部門が返すレコードの数に応じて、実際に大量のクエリを実行しています。これを実行するたびに、特にオフにしない限り、レコードごとにオブジェクトをハイドレートすることになります。これにより、多くの場合、処理が非常に遅くなります。結合を使用した 2 つのクエリだけで最適化できる可能性があります。

Zend_Db_Table_Row と Zend_Db_Table_Rowset を完全にバイパスしていることを確認することもできます。

于 2012-10-22T18:44:18.650 に答える