1

全て、

これら 2 つのサービスのいずれかを使用してバックグラウンドで仕事をする良い方法を探しています。

PHPFog は IronWorks をサポートしているようですが、もっとリアルタイムなものが必要です。これらのクラウド ベースの PaaS サービスでは、 を使用できませんpopen(background.php --token=1234)。だから私は最善の解決策を考えています.仕事を処理するためにギアマンの労働者を追い出そうとすることかもしれません. (実際、私の好みの方法は、AJAX を介して db テーブルを長時間ポーリングするのではなく、websockets を使用して接続を開いたままにし、ジョブからのフィードバックを受け取ることですが、これらの人は誰も websocket をサポートしていません)

質問 1 は、gearman を使用してジョブをオフロードするよりも良い解決策はありますか?

質問 2 は、http: //help.pagodabox.com/customer/portal/articles/430779 です。pagodabox は「ワーカー リスナー」をサポートしているようですが、ギアマンで設定した人はいますか? それはうまくいくでしょうか?

ありがとう

4

1 に答える 1

2

現在構築中のアプリケーションで、バックグラウンド ワーカーで PagodaBox を使用しています。基本的に、PagodaBox は PHP プロセスをデーモン化します (つまり、バックグラウンドで継続的に実行されます)。そのため、実際に行う必要があるのは、データベース テーブルで実行するタスクをチェックし、それらを実行してから少しスリープするスクリプトを作成することだけです。データベースに対してあまり多くのクエリを実行していません。

これは私が実行しているものの簡略化されたバージョンです:

// Remove time limit
set_time_limit(0);

// Show ALL errors
error_reporting(-1);

// Run daemon
echo "--- Starting Daemon ---\n";
while(true) {

    // Query 'work_queue' table for new tasks
    // Loop over items and do whatever tasks are associated with them
    // Update row to mark task as completed

    // Wait a bit
    sleep(30);
}

このアプローチの利点は、CLI 経由で簡単にテストできることです。

php tasks.php

実行中にすべてのechoステートメントがコンソールに表示されます。もちろん、Gearman などの他の依存関係を使用するより複雑なセットアップよりもはるかに簡単です。

したがって、新しいタスクをテーブルに追加するたびに、そのタスクがバッチで開始されるまで待機する最大時間は 30 秒 (またはスリープ時間に関係なく) です。これは、cron ジョブよりも優れており、望ましいことです。なぜなら、cron ジョブを毎分 (可能な限り短い間隔で) 実行するように設定し、実行しなければならない作業に 1 分以上かかる場合、別の cron プロセスが同じキューで作業を開始し、デバッグやトラブルシューティングが困難な多くの問題を引き起こす可能性のある非常に多くの重複したタスク作業が発生する可能性があります。そのため、すべてのタスクを実行するバックグラウンド ワーカーが 1 つだけの場合、またはさまざまな種類のタスクで動作する複数のバックグラウンド ワーカーがある場合、この問題は発生しません。

于 2012-12-01T17:46:45.473 に答える