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 прямо сейчас, таким образом, я не могу протестировать его, но раз так многие люди советовали ему, затем это должно добиться цели :)
Спасибо, все!
На платформах 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
, что стоит проверить в производственном коде).
Вы можете проверить управление процессами PHP:
http://us.php.net/manual/en/intro.pcntl.php
Примечание. Это не многопоточность , а обработка отдельных процессов. Прилагаются дополнительные накладные расходы.
Вы можете выполнять некоторые потоки в PHP, если используете метод pcntl_fork.
http://ca.php.net/manual/en/function.pcntl-fork.php
Я никогда не использовал это сам, но это хороший пример того, как использовать его на php.net.
PHP не поддерживает многопоточность, поэтому нет другого варианта, кроме как использовать возможности ОС или веб-сервера по многопоточной обработке. Обратите внимание, что на самом деле вы можете получить как результат, так и вывод exec:
string exec ( string $command [, array &$output [, int &$return_var ]] )
Не решит ли вашу проблему форк, сохраняя родительский процесс свободным для других соединений и действий? See http://www.php.net/pcntl_fork. Если вам нужен ответ, вы можете слушать сокет в родительском процессе, а писать в дочернем. Возможно, подойдет простой цикл while(true) с чтением, и, вероятно, у вас уже есть такая базовая функциональность, если вы используете постоянный TCP-сервер. Другим вариантом может быть отслеживание идентификаторов дочерних процессов, хранение в доступном хранилище (файл/база данных/memcached и т.д.), с pcnt_wait в главном процессе с WNOHANG для проверки того, какой процесс завершился, и получения данных из хранилища.
В PHP нет такой функциональности, насколько я знаю
Вы можете эмулировать функцию, используя другую технику, например, эту: Параллельные функции в PHP