我编写了一个聊天应用程序。一切正常。但我有一些延迟回应。
代码:
var lastMsgID = '0';
$(document).ready(function(){
$("#submitmsg").click(function(){
var clientmsg = $("#usermsg").val();
$.post("jqpost.php", {usermsg: clientmsg });
$("#usermsg").attr("value", "");
return false;
});
setTimeout (poll, 500);
//poll();
}
);
function poll(){
$.ajax({
url: "jq.php",
type: "GET",
data: "mid=" + lastMsgID,
dataType: "json",
async: true,
cache: false,
timeout: 30000,
complete: poll,
success: function(data){
//we got the msgs and will be displaying it... and update the variable 'lastMsgID' with the last id
}}
);
}
服务器端(PHP): //查询数据库 $ result = $ mysqli-> query($ sql);
$wait_start = time();
$wait_current = 0;
while ($wait_current < 20 && $result->num_rows == 0)
{
usleep(200000); // 0.2 seconds
$result = $mysqli->query($sql);
$wait_current = time() - $wait_start;
}
if($result->num_rows > 0)
{
//echo the new msgs...
}
问题是,当我发送消息时,通过轮询接收它(以及任何新消息)大约需要9到15秒。
我已经检查过Firebug,发现“jqpost.php”的POST显示了一个加载图标,同时poll()发出的GET请求也显示了加载图标。 我认为,他们处于同步模式或等待响应。但$ .ajax设置为异步模式!
我是这个jQuery的新手。所以我请你原谅这个愚蠢的问题。 :) 我已经通过更改代码和其他一些东西尝试了调试。但并非没有成功。这就是我在这里发布的原因。
谢谢...
修改
jqpost.php代码:
if(isset($_SESSION['chatuser']))
{
if($_SERVER['REQUEST_METHOD'] == 'POST')
{
if(!isset($_POST['usermsg']) || empty($_POST['usermsg']))
exit('Error');
$stmt = $mysqli->prepare("INSERT INTO chat_tblMsg(m_name , m_uid , m_msg , m_time ) VALUES (? , ? , ? , CONVERT_TZ(NOW(), '-04:00' , '+05:30') )");
$stmt->bind_param('sss', $_SESSION['chatuser']['uname'], $_SESSION['chatuser']['uid'], trim($_POST['usermsg']));
/* execute prepared statement */
$stmt->execute();
/* close statement and connection */
$stmt->close();
/* close connection */
$mysqli->close();
}
}
答案 0 :(得分:0)
轮询查询是否持有数据库锁,阻止后查询执行?
如果您在睡觉前关闭$ result会发生什么:
while ($wait_current < 20 && $result->num_rows == 0)
{
if (isset($result))
{
$result->close();
}
usleep(200000); // 0.2 seconds
$result = $mysqli->query($sql);
$wait_current = time() - $wait_start;
}