bigdata — обработка больших данных

Я пытаюсь обрабатывать большие данные с помощью PHP (100 000 000 записей). Я загружаю каждую запись с другого сервера, затем проверяю текст и, возможно, вставляю 10% соответствующих записей в мою БД (MySQL). Моя проблема:

  1. веб-браузер только что закончил и обработка преждевременно прервана

  2. после каждой проверки xy я хочу напечатать в браузере количество
    соответствующие записи, но ничего не печатается

MySQL не является проблемой. Похоже, что браузер может что-то напечатать после завершения скрипта, но я хочу на короткое время прервать этот скрипт (поток), распечатать мой результат через браузер и затем продолжить. Во время обработки данных браузер «зависает». Есть идеи?

пример:

    for ($i=0; $i<100000000; $i++) {
if (($i % 1000) == 0) {  //every 1000th iteration
echo $i;               <=== HERE I need interrupt script and let browser print my result
}
}

2

Решение

Прежде всего, ignore_user_abort твой лучший друг. Соединить с set_time_limit(0) и вы обезопасили свой процесс от смерти.

Во-вторых, отправить что-то пользователю — сложная задача. Причина в том, что все, что вы выводите, проходит через пару буферов. Это включает в себя PHP, Apache, балансировщики нагрузки, которые может использовать ваше приложение, браузер и т. Д. (Примечание: буферы обычно легко настраиваются (это отключено), но они есть по причине). Поэтому просто echoМожет не всегда работать.

Существует несколько способов решения этой проблемы.

Одним из решений является использование услуг связи в реальном времени, таких как Pusher или Ably (я предпочитаю последнее для более приятного бесплатного плана), или развертывание собственного решения с использованием веб-сокетов. Затем вы просто отправляете сообщение каждые 1k итераций и слушаете его в своем JS. Бонус заключается в том, что если браузер пользователя дает сбой и он снова открывает его, процесс и обновления будут работать правильно. Это (на мой взгляд) самый правильный способ сделать это, но может быть трудно понять, как правильно.

Другим решением было бы разделить данные. То есть JS отправляет ajax-запрос, обрабатывает 1k строк, echoи умирает. Затем JS отправляет другой запрос, который обрабатывает следующие 2k строк. Это может быть легче сделать, но зависит от клиента для отправки запросов. Также «загрузка каждой записи с другого сервера» может быть затруднена с использованием этого метода.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector