(я читаю другие вопросы, но они относятся к более старым версиям PHP или многопоточности внешнего интерфейса)
У меня есть приложение PHP / PostgreSQL, которое имеет сложную часть обработки бэкэнда. По сути, существует очень большой цикл (несколько тысяч итераций), повторяющий одни и те же данные снова и снова (с перестановками). В каждом цикле считываются одни и те же данные, применяются операции, результат записывается обратно в базу данных. Циклы полностью независимы друг от друга, результаты не сохраняются между циклами. Фактически, чтобы очистить кэш-память объекта (используя Doctrine), я очищаю кэш каждые 100 или около того циклов.
Итак, по сути, у меня есть:
for ($i=0; $i<5000; $i++) {
// fetch data
// manipulate data
// write results to a different table
}
Во время этих циклов исходные данные никогда не затрагиваются, заполняются только несколько таблиц результатов.
В настоящее время это занимает несколько минут. Мне кажется, как учебник пример параллельной обработки.
Каков наилучший способ поместить это в несколько угроз? Меня не волнует порядок выполнения или даже если рабочая нагрузка распределяется равномерно (по характеру операций с данными, если все потоки запускают одинаковое количество циклов, они должны иметь более или менее одинаковую рабочую нагрузку). Все, что я хочу, это использовать больше процессорных ядер.
Я сделал многопоточность в PHP 5, и это было ... ну ... не идеально. Работоспособно, но сложно. Улучшилось ли это в PHP 7? Есть ли относительно простой способ сказать "for (...) и запустить его в n потоков"?
Если это имеет значение, приложение написано на Symfony4, и этот внутренний процесс вызывается через консольную команду.