Параллельное выполнение задач PHP

122
06 июля 2019, 16:40

Есть файл который запускается каждые N минут. Когда запускается этот файл там происходит примерно следующее:

  1. Выводиться список групп из MySQL.
  2. Начинает обновлять информацию о группах делая запрос в API VK.
  3. Получает нужную информацию и записывает их в MySQL.

Если делать последовательно, получается критическое время ожидания. Важно что бы 100 групп выполнялись не более 1 минуты. Если сделать эту задачу не последовательно а параллельно, в теории это будет занимать примерное 10 секунд и даже меньше. Вопрос уже будет состоят в мощности сервера, но это не проблема.

Можно конечно создать десятки файлов и поставить их в КРОН задачу. Но мне кажется есть куда элегантнее решение да и конце в концов правильное.

Answer 1

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

Варианты есть такие:

  1. Использовать другой язык. Гапример Go - он очень хорош в плане многопоточности. Sad but true.
  2. Оптимизировать работу скрипта. 10-20 секунд на обработку 5 сущностей - это, в общем случае, очень долго. Но тут надо знать вашу специфику.
  3. Запускать несколько процессов демонов, которые будут крутиться в бесконечном цикле и читать задания из очереди (например RabbitMQ, Redis и т.д.)
  4. То же, что и 3, но пушить задания в воркеры из мастер-процесса оркестратора.

UPD в связи с обновлением вопроса

Скорее всего узким местом у вас является запрос к API VK. В этом случае можно использовать curl_multi_init, для распараллеливания запросов.

Answer 2

Можешь попробовать расширение pthreads или multicurl (обрати внимание на библиотеку http://docs.guzzlephp.org/en/stable/). Может быть тебе подойдет этот вариант http://php.net/manual/ru/function.pcntl-fork.php. Как я понял, список групп можно запросить один раз и потом, уже исходя из содержимого списка, необходимо выполнять запросы ко внешнему API.

READ ALSO
Как настроить htaccess под файлы в MVC?

Как настроить htaccess под файлы в MVC?

есть проблемаЯ сделал MVC на PHP, который распознает / в строке и делает соответствующие действия

151
Как организовать Long Polling на сервере.

Как организовать Long Polling на сервере.

Я не до конца понимаю как будет работать этот методДопусти я отправил запрос на сервер и зациклил его, до получения новых данных

142
Проблема с кодировкой UTF

Проблема с кодировкой UTF

Разрабатываю ссылки аналогичные в социальных сетяхПолучаю метаданные для этих ссылок

153
PHP, MySQL | Таблицы, ошибка при выводе данных

PHP, MySQL | Таблицы, ошибка при выводе данных

Не работает вывод данных из таблицы, хотя раньше работалоКак можно пофиксить?

155