Многопоточность / параллельная обработка в PHP

У меня есть PHP-скрипт, который будет генерировать отчет с использованием PHPExcel из данных, запрошенных из базы данных MySQL. В настоящее время он линейный в обработке, поскольку он возвращает данные из MySQL, читает в шаблоне Excel, записывает данные в шаблон, а затем выводит его. Я оптимизировал код до такой степени, что данные повторяются только один раз, и на стороне PHP очень мало обработки. Запрос возвращает сотни строк менее чем за 0,51 секунды, поэтому он работает достаточно быстро. После некоторых сроков я обнаружил, что мои узкие места (удивление, удивление) читают шаблон и записывают вывод. Я хотел бы сделать это:

Spawn a thread/process to read the template Spawn a thread/process to fetch the data Return back to parent thread - Parent thread will wait until both are complete Proceed on as normal 

Мои главные вопросы: возможно ли это, стоит ли это? Если да, то как бы вы справились с этим? Кроме того, это PHP 5 на CentOS

Как правило, не рекомендуется разворачивать процесс Apache. Это может привести к неопределенным результатам. Вместо этого предпочтительным является использование какого-либо механизма очередей. Gearman – механизм массового обслуживания с открытым исходным кодом, который вы можете использовать. У меня также есть сообщение в блоге Zend Server Job Queue, в котором говорится о запуске задач асинхронно. Вы очереди? Введение в очередь работы сервера Zend .

Вы также можете использовать что-то вроде классов Zend Framework Queuing для реализации некоторой асинхронной работы. Zend_Queue

@Swisstack, также я не соглашусь с вашим утверждением, что PHP не создан для высокой производительности. Очень редко языковые особенности являются причиной медленной работы. Возможно, сделав исходный языковой тест, сравнивающий $ a ++ среди разных языков, вы увидите это, но этот тип тестирования не имеет значения. Я несколько лет консультировался с PHP, и я никогда не видел проблемы с производительностью из-за языка.

Я попытался бы выяснить, можно ли кэшировать или хранить шаблон в некотором более быстром формате. Я не знаю, возможно ли это, но форум PHPExcel довольно хорош и за ним следят разработчики.

Вы не можете многопоточно, но можете использовать fork ( pcntl_fork , pcntl_wait ). Как я точно знаю, вам нужно будет тщательно проверить время появления икры, чтобы убедиться, что это даже стоит того, чтобы ваша ситуация.

 $pid = pcntl_fork(); if ($pid == -1) { // fork failed } elseif ($pid > 0) { // we're the parent! Wait for child to finish pcntl_waitpid($pid); } else { // we're the child } 

Если бы оба читали шаблон, а запрос db были медленными, то я бы сказал, что есть достойный шанс, что полезная производительность может быть достигнута путем параллельной работы задач. Но вы сами это сказали, чтение шаблона происходит медленно, а запрос db выполняется быстро. Таким образом, даже игнорируя любые дополнительные накладные расходы, создаваемые с помощью дополнений, необходимых для выполнения задач параллельно, в лучшем случае вы стоите сэкономить 0,001 секунды (время, необходимое для запроса db).

Выполнение нескольких задач параллельно всегда будет требовать времени самой медленной задачи. Выполнение заданий последовательно – это сумма всех задач. В вашем случае шаблонTime + queryTime (0.001)

Не стоит этого.

Обычно база данных является черепахой в уравнении. Вы можете сделать эту часть async без особых усилий. См. Недавно добавленные функции mysqli_poll () и друга.

Вы можете определенно создать процессы на CentOS с PHP ( http://php.net/manual/en/function.pcntl-fork.php ). Прежде чем это сделать, я бы рассмотрел хотя бы одну вещь … Если узкое место, похоже, читает шаблон и записывает результат, это может быть проблема с ограничениями ввода-вывода, и поэтому обращение к нескольким процессам может не помочь … Лично я бы попытался посмотреть, можно ли вместо этого кэшировать …

Прочитайте шаблон один раз, затем сделайте клон для каждой книги, которую необходимо создать из данных