0

私は、 Laravel4AngularJSで書かれた完全な AJAX メーリング アプリケーション ( SPA ) に取り組んでおり 、ユーザーはメッセージを作成して定義済みの連絡先グループに送信できます。

問題は、送信メーリングを担当するタスクが非常に長い時間がかかる可能性があるため、バックグラウンドで実行する必要があることです。

私が提供したい主な機能は、メール送信タスク全体を「開始」および「停止」する機能ですが、現時点では行き詰まっています...

私は2つのアプローチについて考えています:

1.「ajaxes」を介してブラウザでアプリケーションが開かれている限り、メールを送信します

送信プロセスは次のようになります。

  1. ユーザーが「開始」ボタンをクリックする
  2. アプリケーションは ajax リクエストを実行して 1 つのメッセージを送信します
  3. 前のリクエストが成功すると、次のリクエストが起動されます(ユーザーが以前に停止していないかどうかを確認した後)など
  4. ユーザーが「停止」ボタンをクリックすると、アプリケーションは、メーリングを停止するようにマークするための別の要求を送信します

このアプローチにより、送信プロセス全体の「開始」と「停止」、およびユーザーの送信全体のプログレスバーを更新するなどの統計の一部をより詳細に制御できます。

しかし、主な制限は、非常に長い時間の送信についてです...1時間以上だと思いますか...? ユーザーはブラウザを開いたままにする必要はありません。そうしないと、メーリングが停止されます... :( または、ページの更新について... :/ (JavaScriptでonunloadイベントを使用できることは知っていますが、エレガントではありません解決)

2. > /dev/null 2>/dev/null & を使用して ajax を介して職人のコマンドを実行します (コマンド出力を待機しません)。

今回は、次のようになります。

  1. ユーザーが「開始」ボタンをクリックする
  2. アプリケーションは次のように ajax リクエストを作成します。

    exec('php '.base_path().'/artisan mailing:send 1 > /dev/null 2>/dev/null &');

  3. アプリケーションは、シェル タスクが正常に実行されたことを通知する 200 応答コードを返します。

このアプローチでは、以前に開始したタスクシェルを停止する方法がわかりません...前のアクションから実行可能なプロセスの「pid」を取得するような方法はありますか??? そして、送信データが破損する可能性があるため、「強制終了」したくありません...

3. 有名な cron ジョブ

これを使用すると、実行中のcronジョブの間隔が短くなるとタスクが重複することを恐れています...そして、間隔が長くなりすぎると未使用のリソースが発生します...

4

1 に答える 1

0

サーバーのシェルにアクセスできる場合、私にとって最善の方法は、バックグラウンドで長時間実行されるタスク (デーモンなど) を使用することです。データベースのメモリ内テーブルなど、ある種のコマンド キューを使用して、タスクと通信できます。

すべてが既に PHP で書かれている (または単一の言語を使用したい) 場合は、php-cli を使用できます。

于 2014-03-07T19:44:54.277 に答える