PHP – параллельная задача

Мне нужен параллельный task runner в PHP (скорее всего, на windows – IIS7 fastcgi), который скрывает полную реализацию. Его интерфейс должен быть примерно таким:

$taskRunner = new ParallelTaskRunner(); $taskRunner->add(function () use ($sharedResource){ //task 1 }); $taskRunner->add(function () use ($sharedResource){ //task 2 }); $taskRunner->run(); //runs task 1, task 2 parallel 

Я провел некоторое исследование: я знаю методы, с помощью которых я могу запускать PHP-код параллельно – pthreads, pcntl, exec, gearman, curl multi и т. Д.

На вопросы, на которые мне нужно ответить:

  • Можно ли скрывать эту реализацию с помощью любого из этих методов? Как это можно сделать (если в деталях реализации есть какой-то передовой способ обхода)? Есть ли библиотека, которая имеет эту функцию?
  • Как я могу извлечь информацию о запуске параллельных задач? Например: task1: { a(); b(); } task1: { a(); b(); } task1: { a(); b(); } , task2: { c(); } task2: { c(); } , как я могу узнать, что вызывающий порядок функций был a(); b(); c(); a(); b(); c(); или a(); c(); b(); a(); c(); b(); или c(); a(); b(); c(); a(); b(); ?
  • Как я могу отлаживать свои задачи, если что-то пойдет не так?

Обновить

Я проверил много возможных решений, и я закончил с pthreads. Гораздо проще использовать потоки, чем процессы … Единственный недостаток, который не поддерживает xdebug.

Solutions Collecting From Web of "PHP – параллельная задача"

Обещания в PHP с помощью pthreads

Что-то я написал, но не успел поговорить о …

Обещания восхитительны, они делают что-то обычно довольно сложным во что-то очень простое.

Каждый понимает концепцию стека, когда мы говорим о Javascript; это то, как выполняются анимации и множество других причудливых вещей, которые мы делаем в Интернете.

По сути, мои попытки написать обещания для pthreads – попытка сделать потоки простыми, как стек Javascript, который все понимают.

Просто так случается, что эта вещь идеально подходит для ваших потребностей:

 $manager = new PromiseManager(); $promise = new Promise($manager, new CalculateTheMeaningOfLife()); $promise ->then( new AddTwo($promise)) ->then( new PrintMeaning($promise)); $manager->shutdown(); 

Вам нужно использовать объекты, а не закрывать (ограничение Zend), но это шаблон обещаний, и он полностью асинхронный и управляемый.

Это PHP, поэтому его можно установить вместе с композитором … если вам нравится такая штука …

https://github.com/krakjoe/promises