Выполнение функций параллельно в PHP

PHP могут вызвать функцию и не ожидают ее для возврата? Так что-то вроде этого:

function callback($pause, $arg) {
    sleep($pause);
    echo $arg, "\n";
}

header('Content-Type: text/plain');
fast_call_user_func_array('callback', array(3, 'three'));
fast_call_user_func_array('callback', array(2, 'two'));
fast_call_user_func_array('callback', array(1, 'one'));

произвел бы

one (after 1 second)
two (after 2 seconds)
three (after 3 seconds)

вместо

three (after 3 seconds)
two (after 3 + 2 = 5 seconds)
one (after 3 + 2 + 1 = 6 seconds)

Основной сценарий предназначается, чтобы быть выполненным как постоянный процесс (сервер TCP). callback() функция получила бы данные от клиента, выполнить внешний Сценарий PHP и затем делает что-то на основе других аргументов, которые передаются callback(). Проблема состоит в том, что основной сценарий не должен ожидать внешнего Сценария PHP для окончания. Результат внешнего сценария важен, таким образом, exec('php -f file.php &') не опция.


Править: Многие рекомендовали смотреть на PCNTL, таким образом, кажется, что такая функциональность может быть достигнута. PCNTL не доступен в Windows, и у меня нет доступа к машине Linux прямо сейчас, таким образом, я не могу протестировать его, но раз так многие люди советовали ему, затем это должно добиться цели :)

Спасибо, все!

10
задан binaryLV 8 June 2010 в 21:22
поделиться

6 ответов

На платформах Unix вы можете включить функции PCNTL и использовать pcntl_fork для разветвления процесс и запускать свои задания в дочерних процессах.

Примерно так:

function fast_call_user_func_array($func, $args) {
  if (pcntl_fork() == 0) {
    call_user_func_array($func, $args);
  }
}

После вызова pcntl_fork два процесса выполнят ваш код с одной и той же позиции. Родительский процесс получит PID, возвращенный из pcntl_fork , а дочерний процесс получит 0 . (В случае ошибки родительский процесс вернет -1 , что стоит проверить в производственном коде).

12
ответ дан 3 December 2019 в 21:19
поделиться

Вы можете проверить управление процессами PHP:

http://us.php.net/manual/en/intro.pcntl.php

Примечание. Это не многопоточность , а обработка отдельных процессов. Прилагаются дополнительные накладные расходы.

2
ответ дан 3 December 2019 в 21:19
поделиться

Вы можете выполнять некоторые потоки в PHP, если используете метод pcntl_fork.

http://ca.php.net/manual/en/function.pcntl-fork.php

Я никогда не использовал это сам, но это хороший пример того, как использовать его на php.net.

1
ответ дан 3 December 2019 в 21:19
поделиться

PHP не поддерживает многопоточность, поэтому нет другого варианта, кроме как использовать возможности ОС или веб-сервера по многопоточной обработке. Обратите внимание, что на самом деле вы можете получить как результат, так и вывод exec:

string exec ( string $command [, array &$output [, int &$return_var ]] )

0
ответ дан 3 December 2019 в 21:19
поделиться

Не решит ли вашу проблему форк, сохраняя родительский процесс свободным для других соединений и действий? See http://www.php.net/pcntl_fork. Если вам нужен ответ, вы можете слушать сокет в родительском процессе, а писать в дочернем. Возможно, подойдет простой цикл while(true) с чтением, и, вероятно, у вас уже есть такая базовая функциональность, если вы используете постоянный TCP-сервер. Другим вариантом может быть отслеживание идентификаторов дочерних процессов, хранение в доступном хранилище (файл/база данных/memcached и т.д.), с pcnt_wait в главном процессе с WNOHANG для проверки того, какой процесс завершился, и получения данных из хранилища.

2
ответ дан 3 December 2019 в 21:19
поделиться

В PHP нет такой функциональности, насколько я знаю

Вы можете эмулировать функцию, используя другую технику, например, эту: Параллельные функции в PHP

0
ответ дан 3 December 2019 в 21:19
поделиться
Другие вопросы по тегам:

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