1

おそらく、この問題に最もうまく取り組む方法を知っている人がいるでしょう。

クライアントがファイルをアップロードできる ZF2 アプリケーションがあります。ファイルには注文が含まれており、処理する必要があります。このファイルの処理をすぐに開始するイベントをトリガーすると、クライアントは (他のことをするために) 先に進むことができません。そのため、このファイルの処理を開始するイベントをバックグラウンドでトリガーしたいと思います。アクションはクライアントに次のページを返し、他のものを入力できるようにします。もちろん、これはcronジョブで解決できます...しかし、ZF2がはるかにイベント駆動型になっているので、別の方法があるのでしょうか? 次のように、バックグラウンドでイベント (またはサービス) をトリガーすることは可能ですか?

public function csvUploadAction()
{
    $id = (int) $this->params()->fromRoute('id', 0); 

    $form = new CsvForm($id);
    // do some validating and stuff...

    if ($form->isValid()) {
    // more stuff..

    $this->getEventManager()->trigger('readCsvInBackground', $this, $parameters);
        return $this->redirect()->toRoute('publications', array(
                        'action' => 'edit', 'id' => $id
                    ));
// etc..
}

私はこのような解決策を探しましたが、何も見つかりません(cronジョブを使用する以外)。誰でもアイデアはありますか?お時間をいただき、誠にありがとうございました!

4

2 に答える 2

2

Bram の言うとおりです。ワーク キューが必要です。

SlmQueueはZF2モジュールであり、キュー抽象化レイヤーのようなものです (現在、Beanstalkd、Amazon SQS、および DoctrineORM のバックエンドを備えています)。私はそれをbeanstalkdで使用していますが、良い結果が得られています。

もちろん、おそらく PHP 用のPheanstalkクライアント ライブラリを介して、beanstalkd を単純化して直接使用することもできます。

于 2013-07-31T22:25:37.173 に答える
1

ジョブキューソリューションを検討する必要があります。一般的な考え方は、csv (base64 エンコード) を含むキューにメッセージ/ジョブを入れるか、csv をディスクに書き込んでメッセージにパスを渡すことです。メッセージをキューに送信するだけで (これは非常に軽量なアクションです)、ユーザーに直接応答を返すことができます。

次に、キューからメッセージを受け取り、それらを FIFO 順で処理するワーカーを作成する必要があります。この作業が非常に重く、待機中のジョブが蓄積し続ける場合は、ワーカーを追加して、多くのワーカーに作業が分散されるようにすることができます (これはファンアウトと呼ばれます)。

PHP クライアント API を備え、ユース ケースに最適なオープン ソース ソリューションは次のとおりです。

于 2013-07-31T09:52:31.747 に答える