Heroku上的PHP应用程序架构

Heroku上的PHP应用程序架构,php,architecture,heroku,Php,Architecture,Heroku,我在Heroku上有一个PHP应用程序,该应用程序与外部API进行大量通信,从而触发数据库上的作业,然后结果显示在Facebook应用程序中 目前我有两个工作进程和一个web进程。web进程触发workers并监视数据库标志,以了解每个worker作业何时完成…我知道…此设置不太好,理想情况下,我希望在每个worker进程完成时在web进程中收到通知,但这似乎不可能 在Heroku中是否有更好的方法使用PHP实现这一点 也许Heroku上的PHP应用程序不是最好的解决方案,但我已经编写了很多PH

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

目前我有两个工作进程和一个web进程。web进程触发workers并监视数据库标志,以了解每个worker作业何时完成…我知道…此设置不太好,理想情况下,我希望在每个worker进程完成时在web进程中收到通知,但这似乎不可能

在Heroku中是否有更好的方法使用PHP实现这一点

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


提前感谢…

我可以想到两件相对简单的事情,不用放弃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呈现它们。

我在Heroku上运行了一个PHP应用程序,基本上可以做到这一点,但是使用
rpush
es和
blpop
s代替pub/sub,效果非常好。如果您想了解这一切是如何结合在一起的,以下是管理web和worker dynos之间通信的主要代码: