【问题标题】:Ajax/PHP - should I use one long running script or polling?Ajax/PHP - 我应该使用一个长时间运行的脚本还是轮询?
【发布时间】:2011-02-26 23:27:10
【问题描述】:

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

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

哪些选项是首选?

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

谢谢你,布赖恩

【问题讨论】:

    标签: php ajax http exec polling


    【解决方案1】:

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

    【讨论】:

    • 是否可以通过使用 PHP 的 set_time_limit() 函数和 Apache 的 KeepAliveTimeout 设置来解决这个问题?
    • 您可以,但对于您发布的问题,这些不是很好的选择。我给你的解决方案是你最好的选择。去过那里,做到了。
    【解决方案2】:

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

    至于 c),也许你会在 AJAX Pattern's Web SiteBrowser-Server Diaglog 下找到一些东西。

    【讨论】:

    • 只需要响应来更新 UI,不需要服务器资源。我最大的担忧之一是随着并发用户数量的增加,哪个选项会更好?谢谢。
    【解决方案3】:

    AJAX 选项对我来说似乎不错。一种替代方法是 Comet(Ajax 推送)样式以最小化所需的流量:服务器在需要说些什么(更新 UI)时向客户端(浏览器)发送信号。

    【讨论】:

      【解决方案4】:

      一) 可能会出现超时问题并锁定服务器请求(通常您设置限制服务器接受连接)。如果许多用户在服务器上添加请求,您可以锁定服务器。在 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),但它增加了实施的努力。也许你有更多的细节?这是一个高流量场景吗?

      【讨论】:

      • 谢谢。执行时间并不总是 30 秒——事实上,通常它会少得多——但也可能更多。目前流量很低,低于 10 个并发用户 - 但我正在寻找能够随着流量增加而实现最佳扩展的解决方案。
      猜你喜欢
      • 2011-09-30
      • 2013-01-10
      • 1970-01-01
      • 2011-04-20
      • 2011-10-16
      • 2012-02-25
      • 2018-04-12
      • 2010-09-18
      • 1970-01-01
      相关资源
      最近更新 更多