php - mysql_fetch_object 非常慢需要大约 30 秒来加载只有 20 行

标签 php mysql database-performance sql-like

<分区>

Possible Duplicate:
Simplest way to profile a PHP script

我们正在使用 MVC 方法构建此在线应用程序(但有点笨拙)。 应用程序的结构如下所示。

class Page{
    private $title;
    private $css;
    private $type;
    private $formData;
    private $obj;

    public function __construct($type){
        //this instance variable is designed to set form data which will appear on the pages
        $this->formData = array();
        $this->setup($type);

    }

    public function setTitle($var){
        $this->title = 'Page : ';
        $this->title .= $var;
    }

    public function getFormData() {
        return $this->formData;
    }


    private function setFormData($tmpObjs) {
        $finData = array();

        foreach($tmpObjs as $value){
            if($value == $this->obj && isset($_GET['new']))
                $newValue = 'true';
            else
            $newValue = 'false';

            $tmpData = array();
            $tmpData = $value->getData($newValue);
            $finData = array_merge($finData, $tmpData);

        }
        return $finData;
    }

    public function getTitle(){
        return $this->title;
    }

    public function displayCSS($_SESSION){
        $GlobalConfig = $_SESSION['Config'];

        $CSS = array();
        $CSS = $GlobalConfig->getCSS();

        $SIZE = count($CSS);

        foreach($CSS as $key => $value){
            echo "<link href=\"".$CSS[$key]."\" type=\"text/css\" rel=\"stylesheet\" />\n";
        }
    }

    public function displayJS($_SESSION){
        $GlobalConfig = $_SESSION['Config'];

        $JS = array();
        $JS = $GlobalConfig->getJS();

        $SIZE = count($JS);

        foreach($JS as $key => $value){
            echo "<script src=\"".$JS[$key]."\" type=\"text/javascript\"></script>\n";
        }
    }

    function setPageType($type)
    {
    $this->type = $type;
    }

    // This is used when you are filtering whatever type for search function

    function getPageType(){
    $type = $this->type;
    echo $type;
    }


    function setup($type){
        $this->type = $type;
        switch($this->type){

            case "AccountExpiry":

            break;

            case "Home":
                $CalendarExpiryItemList = new CalendarExpiryItemList();
                $CalendarExpiryItemList->createList();

                $_SESSION['Active_Form'] = 'homepage-record';
                $this->obj = $CalendarExpiryItemList;

                $objs = array($CalendarExpiryItemList);
                $this->formData = $this->setFormData($objs);

                $this->setTitle('Home');

            break;        
        }
    }

    function generateJS(){
        if(file_exists('../classes/Javascript.class.php'))
            include_once '../classes/Javascript.class.php';

        $JSType = str_replace(" " , "", ucwords(str_replace("-", " ", substr(end(explode("/", $_GET['page'])), 0, -4))));
        $JSType = $_GET['page'];

        if(substr($JSType, -1) == 's')
             $JSType = substr ($JSType, 0, -1);

        echo $JSType;
        $new_obj_name = $JSType . "JS";

        $jsObj = new $new_obj_name($this->type);        
    }


    function getObject(){
        return $this->obj;
    }

    //There is more code, file has been omitted for forum
}

下面是CalendarExpiryItemList类

class CalendarExpiryItemList
{
    private $List = array();

    public function __construct()
    {
        //Nothing To Do Yet
    }

    public function createList($Type = "Followups")
    {
        switch($Type)
        {
          case "ALL":
             $this->List = array();
             $this->getAllItemsInArray();
             return $this->List;
          break;

          case "Invoice":
            $this->List = array();
            $this->getInvoiceCalendarItems();
            return $this->List;
          break;

          case "Followups":
            $this->List = array();
            $this->getFollowUpExpiryItems();
            return $this->List;
          break;
        }
    }

    public function _compare($m, $n)
    {
        if (strtotime($m->getExpiryDate()) == strtotime($n->getExpiryDate()))
        {
            return 0;
        }

        $value =  (strtotime($m->getExpiryDate()) < strtotime($n->getExpiryDate())) ? -1 : 1;

        echo "This is the comparison value" . $value. "<br/>";

        return $value;
    }

    public function display()
    {
        foreach($this->List as $CalendarItem)
        {
            echo "<tr>";
                if($CalendarItem->getType() != "ContractorInsurance")
                    echo "<td>".DateFormat::toAus($CalendarItem->getExpiryDate())."</td>";
                else
                    echo "<td>".$CalendarItem->getExpiryDate()."</td>";
                echo "<td>".$CalendarItem->getType()."</td>";
                echo "<td>".$CalendarItem->getDescription()."</td>";
                echo "<td>".$CalendarItem->doAction()."</td>";
            echo "</tr>";
        }
    }

    public function getData()
    {
        $data = array();
        $data['Rows'] = "";
        $TempArray1 = array();

        foreach($this->List as $CalendarItem)
        {
            $Temp = "";
            $Temp .= "<tr>";
                if($CalendarItem->getType() != "ContractorInsurance")
                     $Temp .= "<td>".DateFormat::toAus($CalendarItem->getExpiryDate())."</td>";
                else
                    $Temp .= "<td>".$CalendarItem->getExpiryDate()."</td>";
                $Temp .= "<td>".$CalendarItem->getType()."</td>";
                $Temp .= "<td>".$CalendarItem->getDescription()."</td>";
                $Temp .= "<td>".$CalendarItem->doAction()."</td>";
            $Temp .= "</tr>";
            $TempArray1[] = $Temp;
        }

        if(count($TempArray1) == 0)
        {
            $Row = "<tr><td colspan='4'>No Items overdue</td></tr>";
            $TempArray1[] = $Row;
        } 

        $data['Rows'] = $TempArray1;
        return $data;

    }

    //---------------Private Functions----------------
    private function SortArrayDate()
    {
        $TempArray = array();
        $TempArray = $this->List;

        $this->List = array();

        foreach($TempArray as $CalendarItem)
        {
            $this->List[$CalendarItem->getExpiryDate()] = $CalendarItem;
        }

        ksort($this->List);

    }

    private function getAllItemsInArray()
    {
        $this->getInvoiceCalendarItems();
        $this->getFollowUpExpiryItems();
        $this->getProjectExpiryItems();
        $this->getVehicleExpiryItems();
        $this->getUserInsuranceExpiryItems();
        $this->getContractorExpiryItems();

        //$this->SortArrayDate();
    }

    private function getContractorExpiryItems()
    {
        $SQL = "SELECT * FROM  `contractor_Details` WHERE  `owner_id` =".$_SESSION['user_id'];

        $RESULT = mysql_query($SQL);

        while($row = mysql_fetch_object($RESULT))
        {
            $InsLic = new ContractorInsLis();
            $InsLic->getContractorInsLisById($row->contractor_id);

            if($InsLic->CheckExpiry($InsLic->getwcic_expiry_date()) == 'Expired')
            {
                $ContractorExpiryItem = new ContractorInsuranceExpiryItem($row->contractor_id,$InsLic->getwcic_expiry_date(),"Contractor ".$row->first_name." ".$row->last_name."'s Workers Comp License expired on ".$InsLic->getwcic_expiry_date());
                $this->List[] = $ContractorExpiryItem;
            }

            if($InsLic->CheckExpiry($InsLic->getpli_expiry_date()) == 'Expired')
            {
                $ContractorExpiryItem = new ContractorInsuranceExpiryItem($row->contractor_id,$InsLic->getpli_expiry_date(),"Contractor ".$row->first_name." ".$row->last_name."'s Public Liability Insurance expired on ".$InsLic->getpli_expiry_date());
                $this->List[] = $ContractorExpiryItem;
            }

            if($InsLic->CheckExpiry($InsLic->getcontractor_expiry_date()) == 'Expired')
            {
                $ContractorExpiryItem = new ContractorInsuranceExpiryItem($row->contractor_id,$InsLic->getcontractor_expiry_date(),"Contractor ".$row->first_name." ".$row->last_name."'s Contractor License expired on ".$InsLic->getcontractor_expiry_date());
                $this->List[] = $ContractorExpiryItem;
            }

            if($InsLic->CheckExpiry($InsLic->getwcic_expiry_date()) == 'Expired')
            {
                $ContractorExpiryItem = new ContractorInsuranceExpiryItem($row->contractor_id,$InsLic->getcompany_expiry_date(),"Contractor ".$row->first_name." ".$row->last_name."'s Company License expired on ".$InsLic->getcompany_expiry_date());
                $this->List[] = $ContractorExpiryItem;
            }
        }
    }

    private function getUserInsuranceExpiryItems()
    {
        $SQL = "SELECT * FROM `user_my_insurances_licences` WHERE `user_id`=".$_SESSION['user_id'];
        $RESULT = mysql_query($SQL);

        while($row = mysql_fetch_object($RESULT))
        {
            $UserInsuranceLicenses = new UserMyLicenseInsurance();
            if($UserInsuranceLicenses->CheckExpiry($row->DL_expiry_date) == 'Expired')
            {
                $ExpiredItem = new UserInsuranceExpiryItem($_SESSION['user_id'],$row->DL_expiry_date,"DL #".$row->DL_number." has expired on ".$row->DL_expiry_date);
                $this->List[] = $ExpiredItem;
            }

            if($UserInsuranceLicenses->CheckExpiry($row->CL_expiry_date) == 'Expired')
            {
                $ExpiredItem = new UserInsuranceExpiryItem($_SESSION['user_id'],$row->CL_expiry_date,"CL #".$row->CL_number." has expired on ".$row->CL_expiry_date);
                $this->List[] = $ExpiredItem;
            }

            if($UserInsuranceLicenses->CheckExpiry($row->BL_expiry_date) == 'Expired')
            {
                $ExpiredItem = new UserInsuranceExpiryItem($_SESSION['user_id'],$row->BL_expiry_date,"BL #".$row->BL_number." has expired on ".$row->DL_expiry_date);
                $this->List[] = $ExpiredItem;
            }

            if($UserInsuranceLicenses->CheckExpiry($row->wcic_expiry_date) == 'Expired')
            {
                $ExpiredItem = new UserInsuranceExpiryItem($_SESSION['user_id'],$row->wcic_expiry_date,"Workers Compe #".$row->wcic_policy_number." has expired on ".$row->wcic_expiry_date);
                $this->List[] = $ExpiredItem;
            }

            if($UserInsuranceLicenses->CheckExpiry($row->pli_expiry_date) == 'Expired')
            {
                $ExpiredItem = new UserInsuranceExpiryItem($_SESSION['user_id'],$row->pli_expiry_date,"Public Liability #".$row->pli_policy_number." has expired on ".$row->pli_expiry_date);
                $this->List[] = $ExpiredItem;
            }

            if($UserInsuranceLicenses->CheckExpiry($row->cwi_expiry_date) == 'Expired')
            {
                $ExpiredItem = new UserInsuranceExpiryItem($_SESSION['user_id'],$row->cwi_expiry_date,"Contract Worker Insurance #".$row->cwi_policy_number." has expired on ".$row->cwi_expiry_date);
                $this->List[] = $ExpiredItem;
            }

            if($UserInsuranceLicenses->CheckExpiry($row->hoi_expiry_date) == 'Expired')
            {
                $ExpiredItem = new UserInsuranceExpiryItem($_SESSION['user_id'],$row->hoi_expiry_date,"Home Owners Insurance #".$row->hoi_policy_number." has expired on ".$row->hoi_expiry_date);
                $this->List[] = $ExpiredItem;
            }

            if($UserInsuranceLicenses->CheckExpiry($row->pii_expiry_date) == 'Expired')
            {
                $ExpiredItem = new UserInsuranceExpiryItem($_SESSION['user_id'],$row->pii_expiry_date,"Professional Indemnity Owners Insurance #".$row->pii_policy_number." has expired on ".$row->pii_expiry_date);
                $this->List[] = $ExpiredItem;
            }

            if($UserInsuranceLicenses->CheckExpiry($row->tic_expiry_date) == 'Expired')
            {
                $ExpiredItem = new UserInsuranceExpiryItem($_SESSION['user_id'],$row->tic_expiry_date,"Tools Insurance #".$row->tic_policy_number." has expired on ".$row->tic_expiry_date);
                $this->List[] = $ExpiredItem;
            }
        }
    }

    private function getVehicleExpiryItems()
    {
        $SQL = "SELECT * FROM  `user_my_motor_vehicles` WHERE  `user_id` =".$_SESSION['user_id'];
        $RESULT = mysql_query($SQL);

        while($row = mysql_fetch_object($RESULT))
        {
            $UserMotorVehicles = new UserMotorVehicles();
            if($UserMotorVehicles->CheckExpiry($row->vehicle_registration_expiry_date) == 'Expired')
            {
                $VehicleRegistration = new VehicleExpiryItem($row->id,$row->vehicle_registration_expiry_date,"Vehicle ".$row->vehicle_reg_no." Registration Expired on ".$row->vehicle_registration_expiry_date);
                $this->List[] = $VehicleRegistration;
            }

            if($UserMotorVehicles->CheckExpiry($row->insurance_expiry_date) == 'Expired')
            {

                $VehicleInsurance = new VehicleExpiryItem($row->id,$row->insurance_expiry_date,"Vehicle ".$row->vehicle_reg_no." Insurace Expired on ".$row->insurance_expiry_date);
                $this->List[] = $VehicleInsurance;
            } 
        }
    }

    private function getProjectExpiryItems()
    {
        $SQL = "SELECT * FROM my_project WHERE user_id =".$_SESSION['user_id']." AND ((end_date < '".date('Y-m-d')."') OR (end_date = '".date('Y-m-d')."') OR end_date='0000-00-00') AND (actual_end_date = '' OR actual_end_date = ' ' OR actual_end_date = '0000-00-00')";

        $RESULT = mysql_query($SQL);

        while($row = mysql_fetch_object($RESULT))
        {
            $Project = new ProjectExpiryItem($row->project_id,$row->end_date,"Project ".$row->project_name." was due on ".$row->end_date,$row->start_date);
            $this->List[] = $Project;

        }
    }

    private function getInvoiceCalendarItems()
    {
        $SQL = "SELECT * FROM project_invoices WHERE (dueDate < '".date('Y-m-d')."') AND (date_paid ='0000-00-00' OR date_paid='') AND (user_id = ".$_SESSION['user_id'].") LIMIT 0, 10";
        $RESULT = mysql_query($SQL);

        while($row = mysql_fetch_object($RESULT))
        {
            $Invoice = new InvoiceExpiryItem($row->id,$row->invoice_date,"Invoice #".$row->id." is overdue.");
            //testObj(array($Invoice));
            $this->List[] = $Invoice;
        }
    }

    private function getFollowUpExpiryItems()
    {
        $SQL = "SELECT * from followUps WHERE owner_id=".$_SESSION['user_id']." AND ((Date_Due < '".date('Y-m-d')."') OR (Date_Due = '".date('Y-m-d')."') OR (Date_Due = '0000-00-00')) AND Completed != '1'";
        $RESULT = mysql_query($SQL);

        while($row =  mysql_fetch_object($RESULT))
        {
            $Form_Id = new FormId();
            $Description = "Follow Up on ".$Form_Id->getFormNam($row->Form_id)." was due on ".$row->Date_Due;
            $FollowUp = new FollowUpExpiryItem($row->Id,$row->Date_Due,$Description);
            $this->List[] = $FollowUp;
        }
    }

这是分页类

<?php

class Pagination {
    protected $Items = array();
    protected $Type = "default";
    protected $Title = "List of ";
    protected $Base_Url = "";
    protected $Table;

    //-------------------------Table Settings----------------//
    protected $No_Of_Columns = NULL;
    protected $No_Of_Items_Per_Page = 10; //By Default 10 items will be displayed on a page.protected
    protected $Present_Page = 0;
    protected $Columns = array();
    protected $Rows = array();

    //------------------------Table Class Attributes---------//
    protected $Table_Class = "";
    protected $Table_Id = "";
    protected $GETVarName = "PP";

    /**
     *
     */
    public function __construct()
    {
        $this->Table = false;
    }

    public function paginate()
    {
        //Check if the base url is set
        if(strlen($this->Base_Url) == 0){
            echo "Error: Could not paginate, No base url Found!";
        }

        //Set the Current page value to Present Page
        if(isset($_GET))
        {
            if(isset($_GET[$this->GETVarName])){
                $this->Present_Page = intval($_GET[$this->GETVarName]);
            } else {
                $this->Present_Page = 1;
            }
        }

        //Draw the table and the values
        $this->generatePaginationTable();
    }

    public function setData($data)
    {
        if(is_array($data)){
            $this->Rows = $data;
            return true;
        } else {
            return false;
        }
    }

    public function putData($object,$functionName = "generateRow")
    {
        $TempData = array();
        if(method_exists($object,"getObjs"))
        {
            $ObjectArray = $object->getObjs();
        }

        if(method_exists($object,$functionName))
        {
            foreach($ObjectArray as $Obj)
            {
                $TempData[] = $object->$functionName($Obj);
            }
        }

        $this->setData($TempData);
        unset($TempData);
    }

    public function setIsTable($val)
    {
        $this->IsTable = $val;
    }

    public function addColumnNames($Col){
        if(is_array($Col)){
            $this->No_Of_Columns = $Col;
        } else {
            return false;
        }
    }

    /**
     * @param $config (array)
     * @return bool
     *
     * this function initializes the Pagination object with the
     * initial values
     */
    public function initialize($config)
    {
        if(is_array($config))
        {
            foreach($config as $key => $value)
            {
                if(isset($this->$key))
                {
                    $this->$key = $value;
                } 
            }
        } else if(is_object($config)) {
            return false;
        } else if(is_string($config)){
            return false;
        }
    }


    //------------------------------Private Function For the Class-------------------------//
    private function generatePaginationTable()
    {
        if($this->Table){
            $this->StartTable();
            $this->DisplayHeader();
        }

        $this->DisplayData();
        $this->DisplayLinks();

        if($this->Table)
            echo "</table>";
    }

    private function DisplayLinks()
    {
        if($this->Table){
        echo "<tr>";
        echo '<td colspan="'. count($this->Rows) .'">';
            $this->GenerateLinkCounting();
        echo '</td>';
        echo "</tr>";
        } else {
            if(count($this->Rows) > 0)
            {
                $ROW = $this->Rows[0];
                $ColSpan = substr_count($ROW,"<td");

                 echo "<tr>";
                echo '<td colspan="'. $ColSpan .'" align="right">';
                $this->GenerateLinkCounting();
                echo '</td>';
                echo "</tr>";
            }
        }
    }

    private function GenerateLinkCounting()
    {
        $this->Base_Url .= $this->getOtherGetVar();
        $StartCount = 1;
        $EndCount = count($this->Rows) / $this->No_Of_Items_Per_Page;

        for($i=0; $i < $EndCount; $i++)
        {
            if($i == 0)
            {
                echo ' <a href="'. $this->Base_Url.'&'.$this->GETVarName .'='.intval($i+1). '" >First</a> ';
            } else if($i == intval($EndCount)){
                echo ' <a href="'. $this->Base_Url.'&'.$this->GETVarName .'='.intval($i+1).'" >Last</a> ';
            } else {
                echo ' <a href="'. $this->Base_Url.'&'.$this->GETVarName .'='.intval($i+1). '" >'.intval($i+1).'</a> ';
            }

        }
    }

    private function getOtherGetVar()
    {
        $Link = "";
        if(isset($_GET))
        {
            foreach($_GET as $key => $val)
            {
                if($key != $this->GETVarName)
                {
                   $Link .= "&".$key."=".$val;
                }
            }
        }

        $h = preg_split("/&/",$this->Base_Url);

        $this->Base_Url = $h[0];
        return $Link;
    }

    private function DisplayData()
    {
        $Index = 0;
        $StartIndex = intval(intval($this->Present_Page-1) * $this->No_Of_Items_Per_Page);


        $EndIndex = intval($StartIndex + $this->No_Of_Items_Per_Page);
        foreach($this->Rows as $Row)
        {
            $Index++;
            if($Index >= $StartIndex && $Index <= $EndIndex)
            {
                echo "<tr>";
                    if(is_array($Row))
                    {
                        foreach($Row as $key => $value){
                            echo "<td>".$value."</td>";
                        }
                    } else {
                        echo $Row;
                    }

                echo "</tr>";
            } 
        }
    }

    private function DisplayHeader()
    {
        if(is_array($this->Columns))
        {
            echo "<thead>";
                echo "<tr>";

                foreach($this->Columns as $Col => $value)
                {
                    echo "<td>".$value."</td>";
                }

                echo "</tr>";
            echo "</thead>";
        }
    }

    private function StartTable()
    {
        echo "<table ";
        if(strlen($this->Table_Class) > 0)
                echo 'class="'.$this->Table_Class.'" ';

        if(strlen($this->Table_Id) > 0)
                echo 'id="'.$this->Table_Id.'" ';

        echo ">";
    }


}

文件的最终实现

<?php
$Page = new Page('Home');

$data = $Page->getFormData();

$Pagination = new Pagination();

$config = array();
$config['Table'] = false;
$config['No_Of_Items_Per_Page'] = 25;
$config['Base_Url'] = base_url() . 'BootLoader.php?page=Homepage';
$config['GETVarName'] = "ODL";

$Pagination->initialize($config);
$Pagination->setData($data['Rows']);



/**
 * Want to have multiple lists
 */

$CalendarExpiryList = $Page->getObject();

$CalendarExpiryList->createList("Invoice");

$InvoiceList = new Pagination();

$config = array();
$config['Table'] = false;
$config['No_Of_Items_Per_Page'] = 25;
$config['Base_Url'] = base_url() . 'BootLoader.php?page=Homepage';
$config['GETVarName'] = "OIDL";

$InvoiceList->initialize($config);

$data2 = $CalendarExpiryList->getData();
$InvoiceList->setData($data2['Rows']);

//This is the display
include_once("Forms/homepage/home-page.html.php");

?>

PHP 脚本运行良好。加载大约需要0.03。 但是当脚本到达 CalendarExpiryItemList 类时。大约需要 30 秒,我的服务器超时。

每个表平均有大约 12 到 15 个字段和大约 10 到 100 条记录。

我正在托管一家托管公司,他们有负载均衡器。因此,如果我的脚本花费的时间超过 30 秒,负载均衡器会重置我的连接并返回一条错误消息“服务器未发送数据”

最佳答案

正如其他人所说,您应该尝试分析您的代码。

...在无法调试代码的情况下,也许 CalendarExpiryItemList 类中的一个或多个方法在某个时候失败了;在查询或关联查询上,或返回无限循环。您应该在测试服务器上单独测试和调试每个方法,以查看获得的结果。对于快速而肮脏的测试,只需将每个方法的输出记录到一个文件中。还要检查 $_SESSION['user_id'] 是否有值并使用 ". (int) $_SESSION['user_id'] ,然后再将其发送到数据库,以防它为空,因为它没有转义。

关于php - mysql_fetch_object 非常慢需要大约 30 秒来加载只有 20 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9286465/

相关文章:

mysql - 当我只需要每个组的最新条目时,如何加速 mySQL 查询?

php - WP插件中的异步php代码

javascript - 将变量从 PHP 函数传递到 JS

php - MYSQL 将数组与数据库表进行比较

php Mail() 和 Outlook

php - 如何在 PHP Mysql 中创建一个公共(public)搜索栏

mysql - 如何禁用MySql搜索结果中的格式字符?

c# - 索引(从零开始)必须大于或等于零

mysql - 更新与更新位置

mysql - 监控 AWS RDS 实例