我有一个通过 ajax 启动的 PHP 脚本。这个 PHP 脚本使用 exec() 通过 shell 运行一个单独的 PHP 脚本。
通过 exec() 调用的脚本可能需要 30 秒左右才能完成。完成后我需要更新 UI。
这些选项中的哪个是首选?
a) 让 HTTP 连接保持打开状态 30 秒,然后等待它完成。
b) 让 exec() 在后台运行 PHP 脚本,然后使用 ajax 轮询检查是否完成(每 5 秒左右)。
c) 我没有想到的其他事情。
谢谢你,布赖恩
每隔几秒轮询一次服务器以获取更新。当您长时间保持连接打开时,总是有可能被服务器或其浏览器丢弃它们(如果 HTTP 请求花费太长时间,浏览器会超时)。
选项 b) 对我来说有点太有状态了。一旦 30 秒完成,服务器是否需要接收请求,否则它会进入错误状态?(就像它不会放弃资源或类似的东西)如果是这样,肯定会选择a)methinks。
至于 c),也许你会在AJAX 模式的网站上的Browser-Server Diaglog下找到一些东西。
AJAX 选项对我来说似乎不错。一种替代方法是 Comet(Ajax 推送)样式以最小化所需的流量:服务器在必须说某事(更新 UI)时向客户端(浏览器)发送信号。
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),但它增加了实施的更多努力。也许你有更多的细节?这是一个高流量的场景吗?