【问题标题】:SetTimeout() causes high cpu usageSetTimeout() 导致 CPU 使用率高
【发布时间】:2015-06-24 06:19:11
【问题描述】:

我正在尝试通过在 PHP 页面中使用警报来显示来电,为此我需要每隔一秒检查一次 mysql 表是否存在来电。

阿贾克斯:

function checkPushTask()
 {
     var idleTimer = null;
     $.ajax({
         type: "POST",
         url: "<?php  echo  CController::createUrl('/site/checkPushTask'); ?>",  
         async:true,
         success: function(msg){
             if(msg != -1)
             {  
                if (idleTimer != null)
                     window.clearTimeout(idleTimer);
                $(".TaskDisplay").html(msg);        
                idleTimer = setTimeout(checkPushTask, 3000);        
             }

             },
         error: function(){

         }
       });
 }
 checkPushTask();

控制器动作:

public function actioncheckPushTask()
    {

        $criteria = new CDbCriteria();
        $criteria->alias = 'qws';
        $criteria->join = 'inner join crm_base_contact on crm_base_contact.crm_base_contact_id = qws.crm_base_contact_id';
        $criteria->condition = 'qws.crm_base_contact_id in (Select crm_base_contact_id from crm_campaign where is_active = 1 and status < 2 and crm_campaign_id in 
                                (select crm_campaign_id from crm_campaign_agent where g_user_id = '.yii::app()->user->getUserID().'))';
        $count = QueryWSModel::model()->count($criteria);
        if ($count > 0)
        {
            $cuser = CRMUser::model()->findByAttributes(array('g_user_id'=>yii::app()->user->getUserID()));
            $pendingmodel = PendingTaskModel::model()->find(array( 'condition' => 'FIND_IN_SET(:QueryWS_agent_id,QueryWS_agent_id)',
                                                                                'params' => array( ':QueryWS_agent_id' => yii::app()->user->getUserID())));
            if (sizeof($pendingmodel) > 0 && $cuser['current_task_id'] == null)
            {
                $user = Yii::app()->getComponent('user');
                $user->setFlash(
                'info',
                CHtml::link('Incoming Call: OpenTask #'.$pendingmodel->crm_task_id,$this->createUrl('operator/TaskOpen',array('id'=>$pendingmodel->crm_task_id)),array('style'=>"color:white"))
                );
                ob_start();
               $this->widget('bootstrap.widgets.TbAlert', array(
                'fade' => true,
                'closeText' => '&times;', // false equals no close link
                'events' => array(),
                'htmlOptions' => array(),
                'alerts' => array( 
                'info' => array('closeText' => '&times;'),
                ),
                ));
                $tab1Content= ob_get_contents();
                ob_end_clean();
                echo $tab1Content;
            }
        }
        else 
            echo -1;
    }

以上查询占用CPU高,请任何人指导我减少CPU负载!

【问题讨论】:

  • if (idleTimer != null) 条件总是返回false
  • 那如何检查请指正
  • 如果您还没有尝试答案,请立即告诉我
  • 可能是因为你的idleTimer是本地的,所以全局设置。
  • 减少,但 CPU 使用率仍然高一点,建议使用其他炼油厂吗?

标签: javascript php jquery performance


【解决方案1】:

条件idleTimer != null 永远不会满足。将变量idleTimer 移出函数范围,因此每次函数执行时都不会创建变量(并初始化为null)。像这样:

 var idleTimer = null;
 function checkPushTask()
 {
     $.ajax({
         type: "POST",
         url: "<?php  echo  CController::createUrl('/site/checkPushTask'); ?>",  
         async:true,
         success: function(msg){
             if(msg != -1)
             {  
                if (idleTimer != null)
                     window.clearTimeout(idleTimer);
                $(".TaskDisplay").html(msg);        
                idleTimer = setTimeout(checkPushTask, 3000);        
             }

             },
         error: function(){

         }
       });
 }
 checkPushTask();

【讨论】:

  • 减少,但 CPU 使用率仍然高一点,建议使用其他炼油厂吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 2013-02-12
相关资源
最近更新 更多