Асинхронное должностное лицо оболочки в PHP

195
задан Boaz 24 March 2014 в 23:21
поделиться

9 ответов

Если это "не заботится о выводе", не мог, должностное лицо к сценарию вызывают с & к фону процесс?

РЕДАКТИРОВАНИЕ - слияние, что AdamTheHut, прокомментированный к этому сообщению, можно добавить это к вызову к exec:

" > /dev/null 2>/dev/null &"

, Который будет перенаправлять оба stdio (сначала >) и stderr (2>) к /dev/null и работать в фоновом режиме.

существуют другие способы сделать то же самое, но это является самым простым читать.

<час>

альтернатива вышеупомянутому двойному перенаправлению:

" &> /dev/null &"
213
ответ дан Community 23 November 2019 в 05:21
поделиться

Я использовал в для этого, поскольку это действительно запускает независимый процесс.

<?php
    `echo "the command"|at now`;
?>
52
ответ дан Martin Vseticka 23 November 2019 в 05:21
поделиться

На Linux можно сделать следующее:

$cmd = 'nohup nice -n 10 php -f php/file.php > log/file.log & printf "%u" $!';
$pid = shell_exec($cmd);

Это выполнит команду при команде prompty и затем просто возвратит PID, который можно проверить на> 0, чтобы гарантировать, что это работало.

Этот вопрос подобен: Делает PHP, имеют поточную обработку?

19
ответ дан Darryl Hein 23 November 2019 в 05:21
поделиться

php-execute-a-background-process имеет некоторые хорошие предложения. Я думаю, что мой довольно хорош, но я смещаюсь:)

13
ответ дан Community 23 November 2019 в 05:21
поделиться

В Linux можно запустить процесс в новом независимом потоке путем добавления амперсанда в конце команды

mycommand -someparam somevalue &

В Windows, можно использовать команду DOS

start mycommand -someparam somevalue
"запуска"
7
ответ дан Leo 23 November 2019 в 05:21
поделиться

Можно также выполнить Сценарий PHP как демон или cronjob: #!/usr/bin/php -q

1
ответ дан felipe.zkn 23 November 2019 в 05:21
поделиться

Используйте именованный FIFO.

#!/bin/sh
mkfifo trigger
while true; do
    read < trigger
    long_running_task
done

Тогда каждый раз, когда Вы хотите запустить длительную задачу, просто запишите новую строку (не блокирующийся в триггерный файл.

, пока Ваш вход меньше, чем PIPE_BUF, и это - сингл write() операция, можно записать аргументы в FIFO и сделать, чтобы они обнаружились как $REPLY в сценарии.

1
ответ дан geocar 23 November 2019 в 05:21
поделиться

правильный способ (!) сделать это к

  1. ветвление ()
  2. setsid ()
  3. execve ()

ветвления ветвления, setsid говорят текущему процессу становиться основным (никакой родитель), execve, чтобы говорить обработке вызовов быть замененной названной. так, чтобы родитель мог выйти, не влияя на ребенка.

 $pid=pcntl_fork();
 if($pid==0)
 {
   posix_setsid();
   pcntl_exec($cmd,$args,$_ENV);
   // child becomes the standalone detached process
 }

 // parent's stuff
 exit();
5
ответ дан 23 November 2019 в 05:21
поделиться

Я использовал это ...

/** 
 * Asynchronously execute/include a PHP file. Does not record the output of the file anywhere.  
 * Relies on the PHP_PATH config constant.
 *
 * @param string $filename  file to execute
 * @param string $options   (optional) arguments to pass to file via the command line
 */ 
function asyncInclude($filename, $options = '') {
    exec(PHP_PATH . " -f {$filename} {$options} >> /dev/null &");
}

(где PHP_PATH - это константа, определенная как define ('PHP_PATH', '/ opt / bin / php5' ) или аналогичный)

Он передает аргументы через командную строку. Чтобы прочитать их на PHP, см. argv .

4
ответ дан 23 November 2019 в 05:21
поделиться
Другие вопросы по тегам:

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