0

私は Heroku に PHP アプリを持っています。アプリは外部 API と多くの通信を行い、それがデータベースでジョブをトリガーし、結果が Facebook アプリに表示されます...

現在、2 つのワーカー プロセスと 1 つの Web プロセスがあります。Web プロセスはワーカーをトリガーし、データベース フラグを監視して、各ワーカー ジョブがいつ完了するかを認識します...わかっています...このセットアップは適切ではありません。理想的には、各ワーカー プロセスが完了したときに Web プロセスで通知を受け取りたいです。終了しましたが、これは不可能のようです...

PHPを使用してHerokuでこれにアプローチするより良い方法はありますか?

Heroku 上の PHP アプリは最善の解決策ではないかもしれませんが、書き直したくない PHP をたくさん書いてきました。

前もって感謝します...

4

1 に答える 1

1

PHP を捨てずにできる比較的簡単なことを 2 つ思いつくことができます (ただし、PHP はあまり推奨されていません。Python/Django、Python/Flask、または Ruby/Rails を使用した方がよいでしょう)。 ):

1 つは、データベースを使用する代わりに、ワーカーを管理するために Redis に切り替えることができることです。これの利点は、Redis には、接続を開いたままシグナルをサブスクライブできる pub/sub システムがあることです。これは、たとえば Web プロセスから接続が開いている場合、ポーリングしなくてもすぐに変更が通知されることを意味します。

2 つは、待機中にページの読み込みをブロックしないように、ajax の使用に切り替えることができることです。すぐにページをロードし、javascript を使用して別の PHP ページにアクセスし、ジョブのステータスの更新を定期的にチェックします。結果が利用可能になったら、javascript を使用してそのページに結果をレンダリングします。

さらに良いことに、ajax long polling を使用します。ページをすぐにレンダリングしてから、javascript を使用してリクエストを送り返します。次に、php ページが 2 番目のリクエストを受信したら、サブスクリプションを Redis に登録し、更新を手動で確認します (Redis を使用していない場合は、更新を確認するだけです)。更新がない場合は、サブスクリプションがメッセージを受信するまで待つか、30 秒間待ちます。(正直なところ、私は PHP で Redis サブスクリプションを行ったことがないので、どのように実装するのかわかりません。簡単に実装できない場合は、代わりに数秒ごとにポーリングしてください。) 30 秒のタイマーが期限切れになった場合、結果がないことを示すjsonを返し、javascriptにすぐに再試行させます。その時間内に結果を受け取った場合は、結果を返し、javascript にレンダリングさせます。

于 2013-02-28T18:08:37.633 に答える