首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >jQuery Ajax请求的响应速度可变

jQuery Ajax请求的响应速度可变
EN

Stack Overflow用户
提问于 2009-07-12 15:29:44
回答 3查看 2.9K关注 0票数 1

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

代码语言:javascript
运行
复制
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文件中,我有以下代码来检索请求的数据:

代码语言:javascript
运行
复制
//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交互这么快,而我的却不是?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-07-12 15:39:35

我假设你是通过FireBug得到响应时间(你提到的800ms - 2.5s )?如果是这样,那么这就是请求本身的时间。此时,所有开发人员领域的JS都已执行,唯一运行的JS是ajax()函数中的jQuery代码。

因此,我认为您可以合理地确定这是您的PHP代码。

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

具体地说,您应该在脚本的顶部添加以下内容:

代码语言:javascript
运行
复制
$start = microtime(true);

最后是这样的:

代码语言:javascript
运行
复制
echo "Time: " . (microtime(true) - $start);

然后,尝试隔离在任何持续缓慢的查询期间使用哪些params/etc。与大多数CRUD应用程序一样,DB通常是罪魁祸首。

编辑:

仔细查看您的代码后,没有明显的错误。我想知道的是,这是不是唯一一个响应时间如此之快的请求。如果是,则表明客户端和服务器之间的连接不是问题所在。它特别是这个脚本。

通过执行我上面提到的操作--直接通过浏览器而不是ajax调用--可以隔离PHP代码,然后通过移动这些微时间语句的位置,隔离特定的代码行。

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

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

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

票数 0
EN

Stack Overflow用户

发布于 2009-07-12 15:43:37

可能在浏览器和任何正在进行的php mem缓存中都进行缓存。

票数 0
EN

Stack Overflow用户

发布于 2009-07-12 15:51:44

网络延迟可能会对ajax调用产生巨大影响,特别是在一方或另一方没有一致的internet连接的情况下。由于这个问题似乎是间歇性的,我建议将网络或缓存作为可能的来源。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1116242

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档