如何防止AJAX服务器端传输?
Posted
技术标签:
【中文标题】如何防止AJAX服务器端传输?【英文标题】:How to prevent AJAX server side transmission? 【发布时间】:2012-12-30 08:50:34 【问题描述】:不询问如何中止 AJAX。
在这种情况下,有谁知道如何防止服务器传输?
例如,在动态分页中,用户可能一次快速滚动 1 行,从而导致很多请求。
这可以在客户端 jQuery 上使用abort
轻松取消,但是对于我们这些在带宽分配上吝啬的人来说,我们如何才能在收到新请求时阻止先前的请求传输?
非常感谢!
具体说明
其实是因为我使用的是jQuery UI Slider,并且设置了slide
事件来命中服务器。
如您所料,如果您将这个傻瓜滑过 10%,服务器就会像疯了一样被击中,并且仍在传输所有数据,即使我已经 abort
ed。
这是问题的真正根源,因为(在我看来)快速按下向上或向下按钮可能无法停止。
【问题讨论】:
【参考方案1】:我想我想多了。
在动态分页的情况下,我想我可以在 php 的开头设置一个等于microtime(true)
的$_SESSION
,并将它保存在一个变量中。
在传输(或任何其他资源密集型步骤)之前,我可以检查它是否仍然相等。如果没有,exit
。
但是,如果其他人可以提出允许多个并行请求的通用解决方案,他们会得到我的检查和 +1。
【讨论】:
您是否已经查看过php.net/manual/en/features.connection-handling.php? @RobW 啊,谢谢你提供的知识! jQuery 的ajax
是否发送所需的中止代码?中止时默认的 PHP 设置是否为exit
(或等效项)?再次感谢!
您必须中止请求本身。为此,您需要将$.ajax()
调用的结果存储在某处,并在创建新请求时调用.abort()
(假设变量存在)。每当请求成功或失败时,使变量无效以释放资源。【参考方案2】:
在这种情况下,您可以考虑使用服务器发送的事件。这将打开一个持久的 HTTP 连接,用于将数据从服务器传输到客户端。这样可以防止客户端快速请求数据并浪费带宽。示例代码:
服务器端:(PHP)
<?php
@set_time_limit(0);
header('Content-type: text/event-stream');
header('Transfer-encoding: chunked');
while(true)
echo 'data:'.$data."/n/n";//todo: send data here
ob_flush();
flush();
?>
客户端:(javascript)
var ev = new EventSource('path/to/script');
ev.onmessage = function(e)
var data = e.data;
//todo: handle data here
;
希望对你有帮助。
【讨论】:
顺便说一下,IE10 不支持 SSE。此外,SSE 并没有解决核心问题,即检测请求何时中止。 caniuse.com/#feat=eventsource 如果你希望连接是双向的,那么你可以使用websocket,但在php中很难设置。 但是SSE可以在需要的时候发送数据,并且只使用一个连接。以上是关于如何防止AJAX服务器端传输?的主要内容,如果未能解决你的问题,请参考以下文章