DenisOgr
@DenisOgr
Developer

Как упростить задачу с очередями и распараллеливанием на PHP?

Есть задача обработать большие данные (две связанные таблицы по 1 млн записей). Обработать, в смысле сделать математ просчеты,
и записать в новые таблицы результаты.
Сделал следующим образом:
-- распаралелил процессы(один парсер), так как очень долго выполняется один просчет.
-- запускаю последовательно пять парсеров (пять классов).

Запускаю через exec() и sleep(mt_rand(1,10)) в несколько потоков каждй скрипт.
При распаралеливании возникла проблема, что парсеры дублируют данные, которые будут обрабатывать. Следовательно,
нужно что бы каждый парсер бронировал за собой записи. Потом появилась потребность в очередях, так как,
все равно получается дублирование. Очереди создал через файл. При начале бронирования в конец файла пишется случайный хеш
и потом через do {}while(пока мой хеш не будет первыйм в списке - ждать, а как будет первым удалить хеш из файла).

Мне кажется, что я сделал сложно и не опытно. Посоветуйте, может можно использовать новые технологии или по более простому?
  • Вопрос задан
  • 2583 просмотра
Пригласить эксперта
Ответы на вопрос 2
pavel_salauyou
@pavel_salauyou
Symfony2 & Angular разработчик
gearman, норм очереди, или rabbitmq
Ответ написан
Комментировать
DmitriyEntelis
@DmitriyEntelis
Думаю за деньги
Дико кривое решение.
Если нужно бронировать данные за парсером, можно использовать что то типа:
UPDATE content SET worker_id = $id WHERE worker_id=null AND state = 0 LIMIT 5;
SELECT * FROM content WHERE worker_id = $id;
, где content - таблица с данными которые обрабатывает парсер, state - признак что запись не обработана, worker_id - некое число идентифицируеющее текущий поток (можно использовать getmypid если в рамках одного сервера, можно генерировать rand, можно явно задавать id из консоли при запуске - не принципиально)

Это решение на большой таблице content и большом количестве парсеров упрется в быстродействие sql, поэтому правильнее использовать серверы очередей как написано в ответе выше.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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