Zend PHP脚本运行得非常慢

时间:2013-08-21 02:17:43

标签: php zend-framework

我有以下代码

$Model_Shifts = new Model_Shifts();
$shifts = $Model_Shifts->getShiftIDs($condition->schedule_id);
$Model_Tasks = new Model_Tasks();
$tasks = $Model_Tasks->getTasksByShiftIDsPositionID($shifts, $condition->position_id, $time);
return count($tasks);

我的Model_Shifts->getShiftIDs()如下

public function getShiftIDs($schedule_id)
{
    $row = $this->fetchAll(
                $this->select()
                     ->from($this->_name, 'id' )
                     ->where('schedule_id = ?', $schedule_id)
        );
    return $row->toArray();
}

我的$Model_Tasks->getTasksByShiftIDsPositionID是以下

public function getTasksByShiftIDsPositionID( $shift_ids, $position_id, $time)
{
    return $this->fetchAll($this->select()
                                ->where('shift_id IN (?)', $shift_ids)
                                ->where('position_id = ?', $position_id)
                                ->where('time_start <= ?', $time)
                                ->where('time_end > ?', $time)
                                );
}

这运行得非常慢!加载大约需要5秒钟。我的数据库根本不大。我正在运行什么操作会导致这么慢?

我知道正是这段代码导致服务器运行缓慢。我对代码进行了评论,然后代码在10毫秒内运行。

编辑: - time_start和time_end在我的数据库中是(int 4)。 - 我用microtime来计算每个函数的使用时间。粗略地说,这两个函数中的每一个都花费了一半的时间(所以2.5秒)。

3 个答案:

答案 0 :(得分:0)

如果您只需要getTasksByShiftIDsPositionID函数中的任务计数,请更新您的查询以仅返回计数。 它比获取所有行然后计数

更快
public function getShiftIDs($schedule_id)
{
    $row = $this->fetchAll(
                $this->select()
                     ->from($this->_name, 'id' )
                     ->where('schedule_id = ?', $schedule_id)
        );
    return $row->__toString();
}

public function getTasksByShiftIDsPositionID( $shift_ids, $position_id, $time)
{
    $select = $this->select()
                    ->from($this->_name, array('COUNT(shift_id) AS shiftcount'))
                    ->where('shift_id IN (?)', $shift_ids)
                    ->where('position_id = ?', $position_id)
                    ->where('time_start <= ?', $time)
                    ->where('time_end > ?', $time);

    $result = $this->fetchRow($select)
    return $result->shiftcount;
}

或者您可以使用连接条件连接两个表并使用where条件来过滤结果

$Model_Shifts = new Model_Shifts();
$shiftCount = $Model_Shifts->getShiftCount($condition->schedule_id,$condition->position_id, $time);

public function getShiftCount($schedule_id,$position_id, $time)
{
    $select = $this->select()
                    ->from($this->_name, array('COUNT(shift_id) AS shiftcount'))
                    ->join(array('task'=>'shift_task'),$this->_name.'.id=task.shift_id', array())
                    ->where('position_id = ?', $position_id)
                    ->where('time_start <= ?', $time)
                    ->where('time_end > ?', $time)
                    ->where('schedule_id = ?', $schedule_id)
    $result = $this->fetchRow($select)
    return $result->shiftcount;
}

答案 1 :(得分:0)

组合查询并在查询中使用count而不是php提高速度。

function getAmountOfTasks($schedule_id){
  $stmtA =   $this->select()
                     ->from($this->_name, 'id' )
                     ->where('schedule_id = ?', $schedule_id);
  $data = $this->fetchRow($this->select()
                                ->from($this->_name, 'COUNT(*)' ) //probably need to change $this->_name here
                                ->where('shift_id IN (?)', $stmtA)
                                ->where('position_id = ?', $position_id)
                                ->where('time_start <= ?', $time)
                                ->where('time_end > ?', $time)
                                );
  return $data[0];
}

答案 2 :(得分:0)

我同意那些说要结合你的疑问的人。 “shift_id IN(?)”非常慢,可能就是你遇到的问题。 另外,在“Where”子句中经常使用的字段添加索引会大大提高速度。