Php 复杂的模型导致速度慢/性能差

Php 复杂的模型导致速度慢/性能差,php,mysql,codeigniter,Php,Mysql,Codeigniter,下面您将找到一个名为getCalls的CodeIgniter模型,我正在将以下值从控制器$manager、$level、$department、$id传递给该模型 在内部,我执行以下操作: 我检查已登录用户的级别,并将其指向正确的代码 我在一个名为$callInfo 我在数据库中为所有连接的列创建索引 在调用处理此模型的控制器时,我面临速度问题。Firebug告诉我加载页面大约需要30秒 请注意,服务器性能和规格没有您预期的那么好。此外,这是唯一一个运行缓慢的“复杂屏幕”,我对下面的代码没有任何

下面您将找到一个名为
getCalls
的CodeIgniter模型,我正在将以下值从控制器
$manager、$level、$department、$id
传递给该模型

在内部,我执行以下操作:

  • 我检查已登录用户的级别,并将其指向正确的代码
  • 我在一个名为
    $callInfo
  • 我在数据库中为所有连接的列创建索引

    在调用处理此模型的控制器时,我面临速度问题。Firebug告诉我加载页面大约需要30秒

    请注意,服务器性能和规格没有您预期的那么好。此外,这是唯一一个运行缓慢的“复杂屏幕”,我对下面的代码没有任何问题,只是速度问题

    请注意,我是通过$.ajax调用该页面的,您可以找到下面的函数

    请告知

    function getCalls($manager, $level, $department, $id){
            $callInfo = array();
            $empMeta = array();
            $MetaEmp = array();     
            $callMeta = array();
            $MetaCall = array();
            $TheCall = array();
    
            if($manager == true && $level == '3'){
                $query = $this->db->query("SELECT id_call, name_co, callStatus_call, dueDate_call, idemp_call FROM ecc_calls_call JOIN ecc_employees_emp ON idemp_call = id_emp JOIN ecc_company_co ON idco_call = id_co JOIN ecc_mempership_memper ON idemp_memper = idemp_call JOIN ecc_department_dep ON id_dep = iddep_memper WHERE status_call = 'active' && name_dep = {$department} ORDER BY id_call DESC");             
                if($query->num_rows() >= 1){
                    foreach($query->result() as $row){
                        //employee meta
                        $employee = $this->db->query("SELECT * FROM ecc_employee_empmeta WHERE idemp_empmeta = {$row->idemp_call}");
                        if($employee->num_rows() >= 1){
                            foreach($employee->result() as $rowEmp){
                                $empMeta[$rowEmp->metaKey_empmeta] = $rowEmp->metaValue_empmeta;
                            };
                            $MetaEmp = array(
                                'first_name' => $empMeta['first_name'],
                                'last_name' => $empMeta['last_name'],
                                'position' => $empMeta['position'],
                                'avatar' => $empMeta['avatar'],
                                'mobile' => $empMeta['mobile']        
                            );
                            //return $MetaEmp;
                        }                   
                        //call meta
                        $call = $this->db->query("SELECT * FROM ecc_call_cmeta WHERE idcall_cmeta = {$row->id_call}");
                        if($call->num_rows() >= 1){
                            foreach($call->result() as $rowCall){
                               $callMeta[$rowCall->metaKey_cmeta] = $rowCall->metaValue_cmeta;
                            };
                            $MetaCall = array(
                                'inDate' => $callMeta['inDate'],
                                'feedback' => $callMeta['feedback'],
                                'reason' => $callMeta['reason']        
                            );
                        }       
                        $callInfo['id'] = $row->id_call;
                        $callInfo['name'] = $MetaEmp['first_name'] . " " . $MetaEmp['last_name'];
                        $callInfo['inDate'] = $MetaCall['inDate'];
                        $callInfo['feedback'] = $MetaCall['feedback'];
                        $callInfo['reason'] = $MetaCall['reason'];
                        $callInfo['company'] = $row->name_co;
                        $callInfo['dueDate_call'] = date('Y-m-d', strtotime($row->dueDate_call));
                        $callInfo['callStatus_call'] = $row->callStatus_call;   
                        $TheCall[] = $callInfo;         
                    }//foreach call
                }//if
                return $TheCall;                
    
            }elseif($level == 1){
                $query = $this->db->query("SELECT id_call, name_co, callStatus_call, dueDate_call, idemp_call  FROM ecc_calls_call JOIN ecc_employees_emp ON idemp_call = id_emp JOIN ecc_company_co ON idco_call = id_co WHERE status_call = 'active' ORDER BY id_call DESC");             
                if($query->num_rows() >= 1){
                    foreach($query->result() as $row){
                        //employee meta
                        $employee = $this->db->query("SELECT * FROM ecc_employee_empmeta WHERE idemp_empmeta = {$row->idemp_call}");
                        if($employee->num_rows() >= 1){
                            foreach($employee->result() as $rowEmp){
                                $empMeta[$rowEmp->metaKey_empmeta] = $rowEmp->metaValue_empmeta;
                            }
                            $MetaEmp = array(
                                'first_name' => $empMeta['first_name'],
                                'last_name' => $empMeta['last_name'],
                                'position' => $empMeta['position'],
                                'avatar' => $empMeta['avatar'],
                                'mobile' => $empMeta['mobile']        
                            );
                            //return $MetaEmp;
                        }                   
                        //call meta
                        $call = $this->db->query("SELECT * FROM ecc_call_cmeta WHERE idcall_cmeta = {$row->id_call}");
                        if($call->num_rows() >= 1){
                            foreach($call->result() as $rowCall){
                                $callMeta[$rowCall->metaKey_cmeta] = $rowCall->metaValue_cmeta;
                            }
                            $MetaCall = array(
                                'inDate' => $callMeta['inDate'],
                                'feedback' => $callMeta['feedback'],
                                'reason' => $callMeta['reason']        
                            );
                        }       
                        $callInfo['id'] = $row->id_call;
                        $callInfo['name'] = $MetaEmp['first_name'] . " " . $MetaEmp['last_name'];
                        $callInfo['inDate'] = $MetaCall['inDate'];
                        $callInfo['feedback'] = $MetaCall['feedback'];
                        $callInfo['reason'] = $MetaCall['reason'];
                        $callInfo['company'] = $row->name_co;
                        $callInfo['dueDate_call'] = date('Y-m-d', strtotime($row->dueDate_call));
                        $callInfo['callStatus_call'] = $row->callStatus_call;   
                        $TheCall[] = $callInfo;         
                    }//foreach call
                }//if
                return $TheCall;                
            }elseif($level == 3){
                $query = $this->db->query("SELECT id_call, name_co, callStatus_call, dueDate_call, idemp_call FROM ecc_calls_call JOIN ecc_employees_emp ON idemp_call = id_emp JOIN ecc_company_co ON idco_call = id_co WHERE status_call = 'active' && idemp_call = {$id} ORDER BY id_call DESC");                
                if($query->num_rows() >= 1){
                    foreach($query->result() as $row){
                        //employee meta
                        $employee = $this->db->query("SELECT * FROM ecc_employee_empmeta WHERE idemp_empmeta = {$row->idemp_call}");
                        if($employee->num_rows() >= 1){
                            foreach($employee->result() as $rowEmp){
                                $empMeta[$rowEmp->metaKey_empmeta] = $rowEmp->metaValue_empmeta;
                            }
                            $MetaEmp = array(
                                'first_name' => $empMeta['first_name'],
                                'last_name' => $empMeta['last_name'],
                                'position' => $empMeta['position'],
                                'avatar' => $empMeta['avatar'],
                                'mobile' => $empMeta['mobile']        
                            );
                            //return $MetaEmp;
                        }                   
                        //call meta
                        $call = $this->db->query("SELECT * FROM ecc_call_cmeta WHERE idcall_cmeta = {$row->id_call}");
                        if($call->num_rows() >= 1){
                            foreach($call->result() as $rowCall){
                                $callMeta[$rowCall->metaKey_cmeta] = $rowCall->metaValue_cmeta;
                            }
                            $MetaCall = array(
                                'inDate' => $callMeta['inDate'],
                                'feedback' => $callMeta['feedback'],
                                'reason' => $callMeta['reason']        
                            );
                        }       
                        $callInfo['id'] = $row->id_call;
                        $callInfo['name'] = $MetaEmp['first_name'] . " " . $MetaEmp['last_name'];
                        $callInfo['inDate'] = $MetaCall['inDate'];
                        $callInfo['feedback'] = $MetaCall['feedback'];
                        $callInfo['reason'] = $MetaCall['reason'];
                        $callInfo['company'] = $row->name_co;
                        $callInfo['dueDate_call'] = date('Y-m-d', strtotime($row->dueDate_call));
                        $callInfo['callStatus_call'] = $row->callStatus_call;   
                        $TheCall[] = $callInfo;         
                    }//foreach call
                }//if
                return $TheCall;                                
            }
    }
    
    这里是ajax函数…

    $.ajax({
        type: 'GET',
        url: "<?php echo base_url() . 'boffice/dataTable/'; ?>" + type + "/" + arg,
        //data: {},//add variables
        beforeSend:function(){
            //this is were the loading image load
            $('.PreviewHere').append('<div class="preloading"><img src="<?php echo base_url() . "assets/images/loading.gif"; ?>" alt="تحميل" /></div>').show();
        },
        success: function(data){
            //successful request, do somthing with the data
            $('.PreviewHere').html(data).show();
            $(".preloading").remove();
        },
        error: function(){
            //failed request
        },
        datatype: 'html'
    })//ajax
    
    $.ajax({
    键入:“GET”,
    url:“+type+”/“+arg”,
    //数据:{},//添加变量
    beforeSend:function(){
    //这是正在加载的图像加载
    $('.PreviewHere').append(“'alt=“تحميل”/>”).show();
    },
    成功:功能(数据){
    //请求成功,请对数据执行某些操作
    $('.PreviewHere').html(data.show();
    $(“.preload”).remove();
    },
    错误:函数(){
    //请求失败
    },
    数据类型:“html”
    })//阿贾克斯
    
    1)单个函数中的逻辑太多。请将其分开。2)您在
    foreach
    循环中执行多个SQL语句。除非您确实知道需要这样做,否则几乎总是有更好的选择。在这种特殊情况下,您可以加入或获取所有ID并执行一个
    SELECT。。。其中id在(…)
    之后。请记住,在生产环境中,即使是2ms的数据库查询也至少有10ms的开销(当您考虑延迟、连接时间等因素时).@ColinMorelli您建议如何打破检查级别的逻辑,非常感谢您的努力,我还建议如何在一个查询中编写所有语句。@ColinMorelli您建议如何将模型中的代码分解为其他三个类,并在适当的位置调用每个类