1

当我使用 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 交互如此之快,而我的却不是?

4

3 回答 3

0

我假设您通过 FireBug 获得响应时间(您提到的 800 毫秒 - 2.5 秒)?如果是这种情况,那么这就是请求本身的时间。那时,您的所有开发人员领域的 JS 都已经执行,唯一正在运行的 JS 是ajax()函数中的 jQuery 代码。

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

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

具体来说,您将在脚本顶部添加以下内容:

$start = microtime(true);

最后是:

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

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

编辑:

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

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

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

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

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

于 2009-07-12T15:39:35.243 回答
0

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

于 2009-07-12T15:43:37.280 回答
0

网络延迟会对您的 ajax 调用产生巨大影响,尤其是在一侧或另一侧没有一致的互联网连接时。由于问题似乎是间歇性的,我建议将网络或缓存视为可能的来源。

于 2009-07-12T15:51:44.067 回答