0

我在 Heroku 上有一个 PHP 应用程序,该应用程序与外部 API 进行大量通信,从而触发数据库上的作业,然后将结果显示在 Facebook 应用程序中......

目前我有 2 个工作进程和一个 Web 进程。Web 进程触发工作人员并监视数据库标志以了解每个工作人员作业何时完成......我知道......这个设置不是很好,理想情况下,我希望在每个工作进程完成时在我的 Web 进程中得到通知完成了,但这似乎不可能......

有没有更好的方法在 Heroku 中使用 PHP 来解决这个问题?

也许 Heroku 上的 PHP 应用程序不是最好的解决方案,但我写了很多我不想重写的 PHP....

提前致谢...

4

1 回答 1

1

我可以想到两件相对简单的事情,你可以在不放弃 PHP 的情况下做(尽管我不得不提到 PHP 没有太多可推荐的,你可能会更好地使用 Python/Django、Python/Flask 或 Ruby/Rails ):

一是您可以切换到 Redis 来管理您的工作人员,而不是使用您的数据库。这样做的好处是 Redis 有一个发布/订阅系统,您可以在其中订阅信号,同时保持连接打开。这意味着如果连接打开,例如来自 Web 进程,您将立即收到更改通知,而无需轮询。

二是您可以切换到使用 ajax,这样您就不会在等待时阻止页面的加载。立即加载您的页面,然后使用 javascript 访问单独的 PHP 页面以定期检查您的工作状态的更新,然后在结果可用时使用 javascript 在页面上呈现结果。

更好的是,使用 ajax 长轮询。立即呈现您的页面,然后使用 javascript 发回请求。然后当您的 php 页面收到第二个请求时,向 Redis 注册订阅,然后手动检查更新(如果您不使用 Redis,只需检查更新)。如果没有更新,则等待订阅收到消息,或等待 30 秒,以两者为准。(老实说,我从来没有在 PHP 中完成过 Redis 订阅,所以我不确定如何实现它——如果你不能轻松地做到这一点,那就每隔几秒钟轮询一次。)如果 30 秒计时器到期,返回 json 表示没有结果并立即重试 javascript。如果您确实在该时间内收到了结果,请返回结果并让 javascript 呈现它们。

于 2013-02-28T18:08:37.633 回答