2010-12-07 4 views
9

Я создаю скрипт PHP, который будет запущен через командную строку. В рамках этого сценария бывают случаи, когда мне, возможно, потребуется развернуть/развить другой скрипт, который может занять много времени. Я не хочу блокировать исходный скрипт от завершения. Если бы я делал это с помощью JavaScript, я мог бы запускать запросы AJAX в фоновом режиме. Это то, что я пытаюсь сделать здесь. Мне не нужно знать, когда заканчиваются вилки, только они начинают и завершают себя.Как запустить скрипт PHP асинхронно?

Как я могу запустить эти PHP-скрипты асинхронно?

foreach ($lotsOfItems as $item) { 
    if ($item->needsExtraHelp) { 
     //start some asynchronous process here, and pass it $item 
    } 
} 
+0

Вы говорите: «Мне не нужно знать, когда вилы полные» и ваш код говорит «и передать ему $ пункта». Вы хотите получить результат или нет? – Jonas 2010-12-07 20:00:29

+0

PHP Не подает в суд на темы, вам нужно разблокировать дочерние процессы, или лучше всего построить cron – RobertPitt 2010-12-07 20:07:06

ответ

2

int pcntl_fork (void)

pcntl_fork() функция создает дочерний процесс, который отличается от родительского процесса только в его PID и PPID. Для получения подробной информации о том, как работает вилка в вашей системе, см. Справочную страницу вашей системы (2).

детали: http://php.net/manual/en/function.pcntl-fork.php

связанный с этим вопрос: PHP: What does pcntl_fork() really do?

Контроль процесса не должен быть включен в среде веб-сервера и неожиданные результаты могут произойти, если какие-либо функции управления процессом используются в веб-сервере Окружающая среда.

детали: http://www.php.net/manual/en/intro.pcntl.php

2

Глядя пользователю предоставлены заметки на 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 ждет его t o закончить, на обоих Windows и Unix.

3
$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 
    } 
} 
Смежные вопросы