Я создаю PHP-скрипт, который будет запускаться через командную строку. В рамках этого сценария бывают случаи, когда мне, возможно, потребуется развернуть / развить другой скрипт, который может занять много времени. Я не хочу блокировать исходный скрипт от завершения. Если бы я делал это с помощью JavaScript, я мог бы запускать запросы AJAX в фоновом режиме. Это то, что я пытаюсь сделать здесь. Мне не нужно знать, когда заканчиваются вилки, только они начинают и завершают себя.
Как я могу запустить эти PHP-скрипты асинхронно?
foreach ($lotsOfItems as $item) { if ($item->needsExtraHelp) { //start some asynchronous process here, and pass it $item } }
$pids = array(); foreach ($lotsOfItems as $item) { if ($item->needsExtraHelp) { $pid = pcntl_fork(); if ($pid == 0) { // you're in the child var_dump($item); exit(0); // don't forget this one!! } else if ($pid == -1) { // failed to fork process } else { // you're in the parent $pids[] = $pid; } } usleep(100); // prevent CPU from peaking foreach ($pids as $pid) { pcntl_waitpid($pid, $exitcode, WNOHANG); // prevents zombie processes } }
Взглянув на вкладки пользователя, посвященные exec, похоже, что вы можете использовать его, посмотрите:
http://de3.php.net/manual/en/function.exec.php#86329
<?php function execInBackground($cmd) { if (substr(php_uname(), 0, 7) == "Windows"){ pclose(popen("start /B ". $cmd, "r")); } else { exec($cmd . " > /dev/null &"); } } ?>
Это запустит $ cmd в фоновом режиме (без CMD-окна) без PHP, ожидая его завершения, как в Windows, так и в Unix.
int pcntl_fork ( void )
Функция pcntl_fork () создает дочерний процесс, который отличается от родительского процесса только его PID и PPID. Для получения подробной информации о том, как работает вилка в вашей системе, см. Справочную страницу вашей системы (2).
подробности: http://php.net/manual/en/function.pcntl-fork.php
связанный с этим вопрос: PHP: Что делает pcntl_fork ()?
Управление технологическим процессом не должно быть включено в среде веб-сервера, и непредвиденные результаты могут произойти, если какие-либо функции управления процессом используются в среде веб-сервера.
подробности: http://www.php.net/manual/en/intro.pcntl.php