2013-08-05 37 views
0

我有yii框架的奇怪问题。在本地主机上,ajax响应需要200毫秒(这是快速的,我很饱和),在我的服务器上,相同的功能需要4到7秒。yii框架上非常缓慢的ajax响应

下面是我的PHP AJAX功能: -

public function actionOpenpopup() { 
        $this->checkAjaxRequest();     

        $user_id = $_GET['uid']; 

        $rows = Yii::app()->db->createCommand() 
           ->select('*') 
           ->from('saved_designs') 
           ->where('uid=:id', array(':id' => $user_id)) 
           ->order('date desc') 
           ->queryAll(); 

        $i = 0; 
        foreach ($rows as $row) { 
           $rows[$i] = $row; 
           $i++; 
        } 
        if ($rows) { 
           echo json_encode($rows); 
        } 
        else 
           echo json_encode(null); 
      } 



function checkAjaxRequest() { 
         if (Yii::app()->request->isAjaxRequest) { 
            header('Content-Type: application/json; charset="UTF-8"'); 
            return true; 
         } else { 
            throw new CHttpException('403', 'Forbidden Access'); 
            exit; 
         } 
       } 

JavaScript代码: -

function sendAjaxCall(data){ 

$.ajax({ 
           type : 'GET', 
           url : 'index.php/request/openpopup', 
           datatype : 'json', 
           data :data, 
       success: function (data) { 
         console.log(data);      
         } 
});  

} 

* 注: - 到目前为止,数据库只有10至20条记录。另外在现场服务器上,我所有的ajax调用都给我缓慢的响应。

+0

此无关的Java。您是否可以在Chrome网络控制台中检查哪部分请求需要时间?如果它是DNS查找等 –

+0

也许你有不好的互联网或主机放慢了某些东西(大量的请求) – ineersa

+0

从本地和现场服务器上有相同的代码判断,可以肯定的是它不是代码。这意味着它是服务器或您与实时服务器之间的连接。如果您处于共享主机环境,则可能有另一个虚拟主机占用资源。 –

回答

1

我会尝试一些事情。首先你echo您的JSON我会杀了你的脚本之后,以确保没有其他运行:

if ($rows) { 
    echo json_encode($rows); 
    die(); 
} 

也在你index.php确保你有取出的调试模式的网站,如果你有任何中间的两个以defined()开头的行启用每个页面加载Yii正在重新创建缓存文件,并且可能需要一段时间,尤其是如果您有像引导程序一样的扩展。在为某人工作并且他们的网站托管在GoDaddy上时,我遇到了这个确切的问题。由于某些原因,文件创建非常缓慢,并且确实拖动了所有内容。

<?php 
$yii=dirname(__FILE__).'/../framework/yii.php'; 
$config=dirname(__FILE__).'/protected/config/test.php'; 

//defined('YII_DEBUG') or define('YII_DEBUG',true); 
//defined('YII_TRACE_LEVEL') or define('YII_TRACE_LEVEL',3); 

require_once($yii); 
Yii::createWebApplication($config)->run(); 

还有其他函数运行缓慢吗?错误日志中有任何错误?

帮助调试的另一个选项是创建另一个不需要AJAX调用的操作。以这种方式调试要容易得多,而不是依靠ajax,而且它可以帮助您缩小问题的根源。另外不知道为什么,但你得到你的行数组,然后重新填充你的行数组,这是非常多余的。

public function actionCheckpopup() { 
    $user_id = $_GET['uid']; 

    $rows = Yii::app()->db->createCommand() 
      ->select('*') 
      ->from('saved_designs') 
      ->where('uid=:id', array(':id' => $user_id)) 
      ->order('date desc') 
      ->queryAll(); 

    echo json_encode($rows); 
    die(); 
} 

然后,只需使用一个浏览器,访问http://yoursite.com/index.php/request/checkpopup?uid=1

+0

另一个问题是数据库与代码在同一台服务器上? – Pitchinnate

+0

非常感谢您的详细解释。我评论了你指出的两条线,但它并没有解决我的问题。反应很慢。是的数据库和代码是在同一台服务器(亚马逊EC2) – RashFlash

+0

嗨Pitchinnate,我尝试使用直接链接调用(如你所说),它产生的结果非常快大约1至2秒。所以有一点是肯定的,服务器响应是好的,但Ajax调用需要很多时间。任何解决方案 – RashFlash