2013-07-06 3 views
0

Я хотел бы запустить php-скрипт в фоновом режиме, так как требуется много времени, и я не хочу ждать его.Как запустить php-процесс в фоновом режиме?

Этот вопрос относится к:

php execute a background process

Я попытался сделать эту работу на моем Linux CentOS машине, но, к сожалению, кажется, не работает.

Это мой код:

$cmd = 'php '.realpath($_SERVER["DOCUMENT_ROOT"]).'/test/sample.php'; 

exec(sprintf("%s > %s 2>&1 & echo $! >> %s", $cmd, $outputfile, $pidfile)); 
exec(sprintf("$s > $s 2>&1 & echo $1", $cmd, $outputfile),$pidArr); 

sleep(2); 

print_r($outputfile); 
print_r($pidfile); 

Я включил сон (2), чтобы убедиться, что сценарий sample.php закончен. Sample.php содержит только echo 'Hello world'; Я попробовал оба варианта exec, но никто из них не работал. Вышеприведенный скрипт не показывает никакого вывода.

Я попытался запустить тот же $ cmd в командной строке linux и показал мне результат из скрипта sample.php.

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

Ваша помощь очень ценится.

+1

Токен/cron: оставляя токен, который может быть строкой в ​​файле или записи в базе данных или что-то подобное, которое ищет длинное задание cron и контролирует его поведение, часто является хорошей альтернативой бегущему фону процессов из браузера. Администратор лучше контролирует, как часто выполняется задание cron, какие разрешения он имеет и что он делает. – Paul

+0

Спасибо, но я хочу запустить его сразу, когда пользователь посещает этот php-скрипт. – BastiaanWW

ответ

2

Вы можете использовать set_time_limit(0), чтобы разрешить запуск сценария неограниченно, и ignore_user_abort(), чтобы сохранить сценарий в фоновом режиме, даже если браузер вкладки закрыт. Таким образом, если вы перенаправляете свой браузер в другое место, скрипт будет работать в фоновом режиме.

+0

Не уверен, что 'ignore_user_abort' будет работать, поскольку запуск exec не приведет к созданию tty. Кроме того, вы можете получить большое количество длинных сценариев, в зависимости от того, что делает скрипт. –

0

Я сделал некоторые корректировки

$cmd = 'php '.realpath($_SERVER["DOCUMENT_ROOT"]).'/test/sample.php'; 
$outputfile = 'ouput.txt'; 
$pidfile = 'pid.txt'; 
exec(sprintf("%s > %s 2>&1 & echo $! >> %s", $cmd, $outputfile, $pidfile)); 
exec(sprintf("$s > $s 2>&1 & echo $1", $cmd, $outputfile),$pidArr); 

sleep(2); 

print_r(file_get_contents($outputfile)); 
print_r(file_get_contents($pidfile)); 

Не уверен, что если вы определили переменные раньше. Я тестировал его на Windows, и он работает

1

Этот подход к запуску php-скриптов в фоновом режиме кажется немного неудобным. И в зависимости от того, передаете ли вы дополнительные параметры на основе ввода пользователя, также можно создать сценарий, в котором злоумышленник может вводить дополнительные команды.

Для использования подобных случаев вы можете использовать cron, если вам не нужен ответ немедленно, или менеджер заданий, например Gearman, где вы можете использовать сервер Gearman для управления связью между запросом и фоновая работа.

Смежные вопросы