完成ajax,然后重新开始
Posted
技术标签:
【中文标题】完成ajax,然后重新开始【英文标题】:Complete ajax, then start again 【发布时间】:2012-12-04 11:31:50 【问题描述】:我正在处理 php-ajax 聊天,我使用两种主要方法:“更新”和“发送”
更新函数(ajax):
$.ajax(
type: 'POST',
timeout: 9999999999999999,
url: 'process.php',
success: ...
);
进程.php:
function update()
if(new messages)
echo new messages...
else
sleep(5);update(); again...
发送函数(ajax):
$.ajax(
type: "POST",
url: "send.php",
success: function()
update();
)
我想在发送新消息时停止运行“更新”请求并立即重新启动它,以便发件人立即看到他的消息。我试过 ajax.abort() 但它仍然可以继续在服务器端执行调用。
如何完成 ajax 调用并返回成功,而不是中止它?
【问题讨论】:
您应该查看网络套接字。挂起请求已通过。 网络套接字支持有限,因此只有在您可以控制使用该应用程序的浏览器(内部)时才有用 @HugoDelsing ...或者如果您不介意为 IE 请注意,大多数代理会切断一个挂 this 长的请求。 @Jan 我可以将超时时间降低到 60 秒,然后在出现“超时”错误时重新启动它,这不是主要问题 【参考方案1】:在您的 PHP 代码中,您可以检查连接是否已中止 http://php.net/manual/en/function.connection-aborted.php
但如果你真的想返回“成功”,我会在 send.php 中的会话中添加一些内容,例如
$_SESSION['SENDNOW']=true;
然后在 Process.php 中我会检查
if(new messages || $_SESSION['SENDNOW']==true)
$_SESSION['SENDNOW']=false;
也许您应该将超时设置为 1 秒以加快响应时间。或者,如果你做得很好,你可以快速(比如每 500 毫秒)检查 $_SESSION['SENDNOW']==true 并且每 5 秒检查一次新消息
【讨论】:
5 sec 是一个例子,我使用 1 sec,但它仍然会有所不同,但 0.5 sec 会使 cpu 加载两次。我喜欢你使用 $_SESSION 的方法 您可以将更新函数更改为每 500 毫秒处理一次。然后在每次尝试时检查会话,并且仅在每次尝试时检查新消息 我们只能在 sleep() 之后检查 $_SESSION['SENDNOW'],我的目标是通过 sleep() 停止调用 在睡眠中你什么也做不了。这就是为什么我建议将睡眠时间保持在最低限度以加快更新速度【参考方案2】:请试试这个:
第一个 document.ready() 函数将 Ajax 调用声明为如下变量:
var ajaxCall = null;
将此代码放入您的 AJAX 函数的顶部:
//AJAX request aborted
if ( typeof ajaxCall != 'undefined' )
return false;
像这样调用 AJAX:
ajaxCall = $.ajax(
type: 'POST',
timeout: 9999999999999999,
url: 'process.php',
success: ...
);
所以每次都不要调用服务器。
【讨论】:
以上是关于完成ajax,然后重新开始的主要内容,如果未能解决你的问题,请参考以下文章