当我使用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交互如此之快,但我的不是?
答案 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呼叫产生巨大影响,特别是如果一方或另一方没有一致的互联网连接。由于问题似乎是间歇性的,我建议将网络或缓存视为可能的来源。