使用jQuery Ajax请求的可变响应速度

时间:2009-07-12 15:29:44

标签: php jquery ajax timedelay

当我使用jQuery Ajax执行异步请求时,有时响应会在800毫秒内快速返回,有时响应很慢,响应以2.50秒(平均)返回,有时会挂起,只显示加载图像。我不确定是不是因为我的PHP代码或jQuery Ajax代码。我使用jQuery Ajax发送一些值:

function get_detail_product(obj)
{       
    var id = obj.id ; 
    var $this = jQuery('#'+id); 
    var Thumb = jQuery('#Scroller div.Container') ;
    jQuery.each(Thumb , function(){
        jQuery(this).css('border' , '#ccc 2px solid');
    });
    $this.parent().css('border' , '#ff8500 2px solid') ;
    var load_area = jQuery('.detail') ;
    //ajax request 
    load_area.html("");
    load_area.html('<div id="loading" style="margin-top:60px;margin-left:350px;"><img src="../images/loading.gif"><br>Loding ... </div>');
    jQuery.ajax({
        url: 'index.php?module=product&popup=on ',
        type: 'POST',
        data: 'pid=' + id ,         
        success: function(result) {
            jQuery('#response').remove();
            load_area.html(result);
            jQuery('#loading').fadeOut(500, function() {
                jQuery(this).remove();
            });
        }
    });
}

在PHP文件中,我有以下代码来检索请求的数据:

//ajax requests 
if(isset($_POST['subcatid']) && is_numeric($_POST['subcatid']))
{
    $subcatid = $_POST['subcatid'] ;
    $products = $dbc->getAll("select * from xxproduct where xsubcatid='$subcatid'") ;
    //send result 
    echo '<table cellpadding="0" cellspacing="0" border="0" id="ScrollerTable"><tr>'; 
    foreach ($products as $p) : echo '<td><div style="border:#ccc 2px solid ; padding:0px;margin-top:20px ; margin-bottom:20px ; margin-left:8px ; margin-right:8px;" class="Container"><a href="javascript:void(0)" id="'.$p['xproductid'].'" onclick="get_detail_product(this)" ><img src="imgsize.phpw=100&h=100&img=../uploads/product/'.$p['xproductid'].'/'.$p['xproductid'].'__1.jpg" border="0"/></a><div style="background-color:#ccc ;text-align:center ; padding:5px; ">'.$p['xproductname'].'</div></div></td>';
    endforeach ;
    echo ' </tr></table>'; 
}

我想知道你是否可以在我的代码中发现任何导致延迟的错误;另外我使用PEAR DB对象与数据库进行交互。

当我在此页面中输入问题的标题时,建议会在大约500毫秒内返回。为什么这个ajax交互如此之快,但我的不是?

3 个答案:

答案 0 :(得分:0)

我假设你通过FireBug得到了响应时间(你提到的800毫秒--2.5秒)?如果是这种情况,那就是请求本身的时间。那时,你所有的开发者JS已经执行了,而且运行的唯一JS就是ajax()函数中的jQuery代码。

所以我认为你可以合理地确定它是你的PHP代码。

我要做的是使用一些php microtime()调用并直接点击该脚本(从浏览器或命令行,而不是通过ajax调用)并打印出microtime结果。

具体来说,您可以在脚本顶部添加:

$start = microtime(true);

最后这个:

echo "Time: " . (microtime(true) - $start);

然后,尝试隔离在任何一致的慢查询期间使用的params / etc。与大多数使用CRUD应用程序的情况一样,数据库通常是罪魁祸首。

修改:

仔细查看代码之后,没有什么明显的错误。我想知道的是,这是否是唯一具有如此疯狂响应时间的请求。如果是,那表明客户端和服务器之间的连接不是问题。它就是这个脚本。

通过我上面提到的 - 直接通过浏览器而不是ajax调用来访问脚本 - 你可以隔离PHP代码,然后通过移动那些microtime语句的位置,隔离特定的代码行。

但如果是我,我会首先关注SQL查询。最喜欢你没有像APC那样使用任何字节码缓存。它是一个很棒的工具,现在还没有广泛使用。

因此代码使用的唯一缓存机制可能是MySQL Query Cache。如果subcatid字段上没有索引,则可能是MySQL正在进行表扫描。但是下次您请求相同的查询(具有相同的subcatid值)时,结果将在查询缓存中,MySQL将立即返回它们。

您可以通过隔离进一步测试:忘记AJAX调用 PHP代码,只需复制并粘贴该查询,插入一些有效的subcatid值,然后直接运行到phpMyAdmin或MySQL CLI或您最喜欢的MySQL工具。如果您在插入新的和不同的subcatid值时看到间歇性的表现,那么您就知道问题所在。

答案 1 :(得分:0)

可能在浏览器中缓存以及正在进行的任何php内存缓存。

答案 2 :(得分:0)

网络延迟会对您的ajax呼叫产生巨大影响,特别是如果一方或另一方没有一致的互联网连接。由于问题似乎是间歇性的,我建议将网络或缓存视为可能的来源。