Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ajax/PHP-我应该使用一个长时间运行的脚本还是轮询?_Php_Ajax_Http_Exec_Polling - Fatal编程技术网

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

Ajax/PHP-我应该使用一个长时间运行的脚本还是轮询?,php,ajax,http,exec,polling,Php,Ajax,Http,Exec,Polling,我有一个通过ajax启动的PHP脚本。此PHP脚本使用exec()通过shell运行单独的PHP脚本 通过exec()调用的脚本可能需要30秒左右的时间才能完成。一旦完成,我需要更新UI 以下哪个选项是首选的 a) 将HTTP连接保持打开状态30秒,然后等待它完成。 b) 让exec()在后台运行PHP脚本,然后使用ajax轮询检查是否完成(大约每5秒一次)。 c) 还有一件我没想到的事 谢谢你,Brian每隔几秒钟轮询服务器一次更新。当您将连接保持打开状态这么长一段时间时,服务器或浏览器总是可

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

通过exec()调用的脚本可能需要30秒左右的时间才能完成。一旦完成,我需要更新UI

以下哪个选项是首选的

a) 将HTTP连接保持打开状态30秒,然后等待它完成。
b) 让exec()在后台运行PHP脚本,然后使用ajax轮询检查是否完成(大约每5秒一次)。
c) 还有一件我没想到的事


谢谢你,Brian每隔几秒钟轮询服务器一次更新。当您将连接保持打开状态这么长一段时间时,服务器或浏览器总是可能会删除连接(如果HTTP请求花费的时间太长,则浏览器会超时)。

选项b)对我来说有点太有状态了。服务器是否需要在30秒后接收请求,否则会进入错误状态?(好像它不会放弃资源或类似的东西)如果是的话,一定要用a)我想


至于c),也许你会在下面找到一些东西。

AJAX选项对我来说很好。另一种选择是Comet(Ajax推送)风格,以最小化所需的流量:当服务器必须说些什么(更新UI)时,会向客户端(浏览器)发送信号。

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

(b) 如果它是30秒长,我就不会像每一秒那样频繁地投票。我会增加投票时间。执行时间是否始终为30秒?轮询样式示例(有效负载为json):


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

只需响应即可更新UI,无需服务器资源。我最关心的一个问题是,随着并发用户数量的增加,哪个选项会更好?谢谢。使用PHP的set_time_limit()函数和Apache的KeepAliveTimeout设置是否可以解决这个问题?您可以,但这些都不是解决您发布的问题的好方法。我给你的解决方案是你最好的选择。去了,去了,谢谢。执行时间并不总是30秒——事实上,通常会少得多——但也可能更多。目前流量很低,不到10个并发用户,但我正在寻找一种解决方案,随着流量的增加,该解决方案的扩展性最好。

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

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