当我使用jQuery Ajax执行异步请求时,有时响应在800ms内快速返回,有时响应很慢,响应在2.50s (平均)内返回,有时它挂起,只显示加载的图像。我不确定这是因为我的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交互这么快,而我的却不是?
发布于 2009-07-12 15:39:35
我假设你是通过FireBug得到响应时间(你提到的800ms - 2.5s )?如果是这样,那么这就是请求本身的时间。此时,所有开发人员领域的JS都已执行,唯一运行的JS是ajax()函数中的jQuery代码。
因此,我认为您可以合理地确定这是您的PHP代码。
我要做的是使用一些php microtime()调用并直接点击脚本(从浏览器或命令行,而不是通过ajax调用),并打印出微时间结果。
具体地说,您应该在脚本的顶部添加以下内容:
$start = microtime(true);最后是这样的:
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值时看到间歇性的性能,那么您就知道问题出在哪里。
https://stackoverflow.com/questions/1116242
复制相似问题