Вопрос по symfony, php, parsing – Как я могу сделать фоновый анализ данных с Symfony2?

4

Я пишу веб-приложение на PHP с Symfony2. Пользователь может загрузить файл CSV с данными, которые сохранены в базе данных. Разбор каждой строки файла CSV длится около 0,2 секунды, потому что я делаю некоторые запросы к API Карт Google.

Поэтому, когда вы загружаете CSV-файл с 5000 строками, что является реальным случаем в моем приложении, для анализа всего файла может потребоваться 16 минут.

Я не хочу, чтобы пользователь ждал 16 минут, пока он не сможет продолжить использовать мое приложение. Итак, мой вопрос: как я могу разобрать файл CSV в фоновом режиме, чтобы пользователь мог продолжать серфинг?

Symfony2 не имеет встроенных возможностей фонового процесса / работника, поэтому вы должны использовать свои собственные. hakre
Я бы пошел с Gearman - его легко настроить, и он действительно очень хорошо работает с PHP. halfer

Ваш Ответ

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
    }
}
Error: User Rate Limit Exceededconst TERMINATE = 'kernel.terminate';, Какая у вас версия Symfony?
Является ли событие & quot; kernel.terminate & quot; вызывается в Symfony2? Мое веб-приложение выдает ошибку, когда я хочу его использовать. rotespferd
Ошибка была сделана мной;) Но теперьonKernelTerminate метод не вызывается, мое приложение не запускает код в этом методе. Я посмотрел в файлеvendor\symfony\src\Symfony\Component\HttpKernel\KernelEvent но не было «прекратить» событие. rotespferd
Error: User Rate Limit Exceeded rotespferd
Зачем называть это прямо? Если это зарегистрировано тогдаonKernelTerminateError: User Rate Limit Exceeded
1

предназначенный только для обработки файла CSV, и выполнить exec () этого сценария из сценария, который управляет загрузкой. В системах * IX вы можете запустить команду exec () в фоновом режиме, добавив & amp; персонаж.

Вы, вероятно, также захотите включить скрипт, который позволит пользователю проверять ход обработки.

Error: User Rate Limit Exceeded
4

команда регулярно управляетсяхрон которая обрабатывает любую работу в таблице очереди заданий.

По мере того, как обработка задания продолжается, вы можете обновить таблицу заданий, чтобы пользователь мог проверить и увидеть прогресс (например, у вас может быть индикатор выполнения ajax) & amp; могу сказать, когда работа будет завершена.

Таким образом, вы также отключаете загрузку от обработки и можете контролировать, сколько заданий обрабатывается одновременно. Запуск долгосрочных заданий непосредственно из пользовательского ввода без системы дросселирования / организации очередей - отличный способ открыть себя для атаки отказа в обслуживании ...

Это звучит как хорошая идея. Я попробую это так. Спасибо :) rotespferd

Похожие вопросы