【发布时间】:2011-01-16 19:30:33
【问题描述】:
我正在构建一个小型 PHP/Javascript 应用程序,它将为美国所有州的所有城市进行一些处理。这会四舍五入到 (52 x 25583) = 1330316 个或更少需要处理的项目。
处理每个项目大约需要 2-3 秒,因此用户可能不得不盯着这个页面 1-2 小时(或者至少在他做其他事情时保持最小化)。
为了给用户最大的反馈,我想通过javascript控制页面的处理,基本上是这样的:
var current = 1;
var max = userItems.length; // 1330316 or less
process();
function process()
{
if (current >= max)
{
alert('done');
return;
}
$.post("http://example.com/process", {id: current}, function()
{
$("#current").html(current);
current ++;
process();
}
);
}
在 html 中,我将收到以下状态消息,每当调用 process() 函数时,该消息就会更新:
<div id="progress">
Please wait while items are processed.
<span id="current">0</span> / <span id="max">1330316</span> items have been processed.
</div>
希望你们都能看到我希望它如何工作。
我唯一担心的是,如果同时向服务器发出这 1330316 个请求,是否有可能导致服务器崩溃/关闭?如果是这样,如果我在服务器端 PHP 代码中使用 sleep(3); 为每个请求额外等待 2 秒,这会让事情变得更好吗?
或者是否有一种不同的机制可以向用户显示快速反馈,例如轮询,而不需要我弄乱 apache 或服务器?
【问题讨论】:
-
每(10,100)个请求更新状态,而不是每个单独的更新呢?这能改善情况吗?
-
它可以但是我会向用户展示什么?
-
此代码尚未生效,我只是在实施此代码之前检查它的任何潜在缺点
-
由于堆栈嵌套太深,您的代码可能在处理过程中的某个时间抛出异常。尽量不要从闭包中运行“进程”函数,而是使用 setTimeout() 在 0 秒后运行它。
-
这听起来确实需要一个更好的解决方案。为什么不进行迭代服务器端,并让该机制将定期状态更新发布到数据库表? UI 然后可以轮询该表以获取更新状态。在服务器上完成这一切而不是在每次迭代之间放置一个 HTTP 事务会大大降低成本!!
标签: php javascript jquery ajax codeigniter