Если это "не заботится о выводе", не мог, должностное лицо к сценарию вызывают с &
к фону процесс?
РЕДАКТИРОВАНИЕ - слияние, что AdamTheHut, прокомментированный к этому сообщению, можно добавить это к вызову к exec
:
" > /dev/null 2>/dev/null &"
, Который будет перенаправлять оба stdio
(сначала >
) и stderr
(2>
) к /dev/null
и работать в фоновом режиме.
существуют другие способы сделать то же самое, но это является самым простым читать.
<час>альтернатива вышеупомянутому двойному перенаправлению:
" &> /dev/null &"
Я использовал в для этого, поскольку это действительно запускает независимый процесс.
<?php
`echo "the command"|at now`;
?>
На Linux можно сделать следующее:
$cmd = 'nohup nice -n 10 php -f php/file.php > log/file.log & printf "%u" $!';
$pid = shell_exec($cmd);
Это выполнит команду при команде prompty и затем просто возвратит PID, который можно проверить на> 0, чтобы гарантировать, что это работало.
Этот вопрос подобен: Делает PHP, имеют поточную обработку?
php-execute-a-background-process имеет некоторые хорошие предложения. Я думаю, что мой довольно хорош, но я смещаюсь:)
В Linux можно запустить процесс в новом независимом потоке путем добавления амперсанда в конце команды
mycommand -someparam somevalue &
В Windows, можно использовать команду DOS
start mycommand -someparam somevalue
"запуска" Можно также выполнить Сценарий PHP как демон или cronjob: #!/usr/bin/php -q
Используйте именованный FIFO.
#!/bin/sh
mkfifo trigger
while true; do
read < trigger
long_running_task
done
Тогда каждый раз, когда Вы хотите запустить длительную задачу, просто запишите новую строку (не блокирующийся в триггерный файл.
, пока Ваш вход меньше, чем PIPE_BUF
, и это - сингл write()
операция, можно записать аргументы в FIFO и сделать, чтобы они обнаружились как $REPLY
в сценарии.
правильный способ (!) сделать это к
ветвления ветвления, 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();
Я использовал это ...
/**
* 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 .