2013-02-28 24 views
0

我在Heroku上一个PHP应用程序,该应用程序做大量的与外部的API,它在数据库上转触发的作业,结果将在Facebook的应用程序显示的通信...PHP应用程序体系结构在Heroku

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

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

也许在Heroku一个PHP应用程序是不是最好的解决办法,但我已经写了很多PHP,我宁愿不重新写的....

在此先感谢...

回答

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呈现它们。

+0

我有一个在Heroku上运行的PHP应用程序,基本上这样做,但用'rpush'es和'blpop's而不是pub/sub,并且它工作得很好。如果你想看看它们是如何结合在一起的,下面是管理Web和工作者dynos之间通信的主要代码:future:https://github.com/ryanbrainard/forceworkbench/blob/master/workbench/async/futures .PHP – ryanbrainard 2013-03-05 04:44:42