Ajax / PHP - 我应该使用一个长时间运行的脚本还是轮询?

时间:2010-06-02 18:34:15

标签: php ajax http exec polling

我有一个通过ajax启动的PHP脚本。这个PHP脚本使用exec()通过shell运行单独的PHP脚本。

通过exec()调用的脚本可能需要30秒左右才能完成。我需要在完成后更新UI。

首选哪个选项?

a)保持HTTP连接打开30秒并等待它完成 b)让exec()在后台运行PHP脚本,然后使用ajax轮询检查完成情况(每5秒钟左右)。
c)我还没有想过的其他东西。

谢谢你,Brian

4 个答案:

答案 0 :(得分:2)

每隔几秒轮询一次服务器以获取更新。当您将连接打开很长一段时间时,服务器或其浏览器可能会丢弃它们(如果HTTP请求耗时太长,浏览器会超时)。

答案 1 :(得分:1)

选项b)对我来说感觉有点过于庄重。服务器是否需要在30秒完成后接收请求,否则它会进入错误状态? (就像它不放弃资源或类似的东西)如果是这样的话,一定要用a)方法。

至于c),也许你会在AJAX Pattern's Web Site下的Browser-Server Diaglog找到一些内容。

答案 2 :(得分:1)

AJAX选项对我来说似乎不错。另一种选择是Comet(Ajax Push)风格,以最大限度地减少所需的流量:服务器在必须说出某些内容(更新UI)时向客户端(浏览器)发送信号。

答案 3 :(得分:1)

A) 可能有超时和锁定服务器请求的问题(通常您设置限制服务器接受连接)。如果许多用户在服务器上添加请求,您可以锁定服务器。在http环境中,我只会在必要时保持打开连接。

b)中 如果它是30秒长,我会像每秒钟那样频繁地进行轮询。我会增加投票时间。执行时间总是30秒?示例轮询样式(有效负载是json):


# trigger job/execution
POST /job
=> response gives 301 redirect to /jobs/{job-id}

# polling
GET /jobs/{job-id}
=> {status:busy}
or
=> {status:completed,result:...}
 

但最终它取决于问题,我喜欢b)更多,但它增加了实施的努力。也许你有更多细节?这是一个高流量的场景吗?