2017-01-20 2 views
2

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

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

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

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 
     } 
    } 
+0

try 'sleep()' function –

+0

Браузер будет печатать только что-либо, когда он завершит удаление - после завершения этого множества циклов, но на cli вы можете см., что .. –

+0

Возможный дубликат [PHP Background Processes] (http://stackoverflow.com/questions/265073/php-background-processes) –

ответ

1

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

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

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

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

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

Смежные вопросы