4

私はSymfony2を使ってPHPでWebアプリケーションを作成しています。ユーザーは、データベースに保存されているデータを含むCSVファイルをアップロードできます。Google Maps APIにいくつかのリクエストを行うため、CSVファイルの各行の解析は約0.2秒続きます。

したがって、5000行のCSVファイルをアップロードする場合、これは私のアプリの現実的なケースであり、ファイル全体を解析するのに16分かかる場合があります。

ユーザーが私のアプリを使い続けることができるようになるまで16分待たなければならないことを望んでいません。だから私の質問は、ユーザーがサーフィンを続けることができるように、バックグラウンドでCSVファイルを解析するにはどうすればよいですか?

4

3 に答える 3

7

イベントリスナーを作成し、kernel.terminateそこで解析を行うことができます。このイベントは、応答がブラウザに送信された後に発生します。サンプルの実装は、

サービス宣言、

//services.yml
csv_parse_listener:
    class: FQCN\Of\CsvParseListener
    tags:
        - { name: kernel.event_listener, event: kernel.terminate, method: onKernelTerminate }

リスナークラス、

namespace Your\namespace;
use Symfony\Component\HttpKernel\Event\PostResponseEvent;

class CsvParseListener
{
    public function onKernelTerminate(PostResponseEvent $event)
    {
        $request = $event->getRequest();
        if($request->get('_route') !== "Your_route"){
            return;
        }

        $csvFile = $request->files->get('file_field_name');

        //move file using $csvFile->move()
        //read and parse
    }
}
于 2012-06-03T09:11:45.667 に答える
4

アップロードでジョブをジョブキューテーブルに挿入し、ジョブキューテーブル内のすべての作業を処理するコマンドをcronによって定期的に実行します。

ジョブの処理が進むにつれて、ジョブテーブルを更新して、ユーザーが進行状況を確認し(たとえば、ajaxプログレスバーを使用できる場合)、ジョブがいつ完了したかを確認できるようにすることができます。

このようにして、アップロードを処理から切り離し、一度に処理されるジョブの数を制御することもできます。スロットリング/キューイングシステムを導入せずに、ユーザー入力から直接実行時間の長いジョブを起動することは、サービス拒否攻撃にさらされるための優れた方法です...

于 2012-06-03T08:41:53.550 に答える
1

CSVファイルを処理するためだけのスクリプトを記述し、アップロードを管理するスクリプトからそのスクリプトをexec()することができます。* IXシステムでは、&文字を追加することにより、exec()によって開始されたコマンドをバックグラウンドで実行させることができます。

また、ユーザーが処理の進行状況を確認できるようにするスクリプトも含めることをお勧めします。

于 2012-06-03T08:38:53.803 に答える