Не удается запустить PHP с помощью команды exec

У меня проблема с запуском непрерывного фонового процесса, в котором родительский процесс инициирует 2 или 3 дочерних процесса, а затем завершается сам, дочерние процессы имеют тяжелые вычисления, поэтому они занимают много времени.

Я использую команду exec для запуска процесса, но не знаю, что он не запускается и не генерирует никаких ошибок (отчеты об ошибках включены, E_ALL и display_errors)

Вот как я пытаюсь это сделать

error_reporting(E_ALL);
ini_set('display_errors',1);
$output = '';
$dir = dirname(__FILE__).'/';
//$cmd = "nohup php {$dir}/background-service.php > /dev/null & echo $!";
$cmd = "nohup php background-service.php >/dev/null 2>&1 &";
exec($cmd );

фон-service.php

<?php
ini_set('max_execution_time', 0);
ini_set('display_errors',1);

file_put_contents('a'.time().'.txt',"this is the test code");

?>

когда я нажимаю на файл напрямую, он генерирует файл, но не с exec, я проверял, что exec включен (сервер ubuntu)

if ( $safe_mode = ini_get( 'safe_mode' ) && strtolower( $safe_mode ) != 'off' )
{
    echo 'Safe Mode is Disabled';
}
else
    echo 'Safe Mode is Enabled<br/>';


if ( in_array( 'exec', array_map( 'trim', explode( ',', ini_get( 'disable_functions' ) ) ) ) )
{
    echo 'exec is Disabled';
}
else
echo 'exec is Enabled<br/>';

Кто-нибудь, пожалуйста, скажите мне, где я ошибаюсь, как я могу определить, отключен ли он сервером

Спасибо


person MZH    schedule 28.02.2013    source источник
comment
спасибо, работает с полным путем, сработало, но проблема в том, что я хочу, чтобы run.php запускал php-файл и заканчивал себя нормально, прямо сейчас он ждет, пока исполняемый файл полностью выполнится, он должен просто вызвать его и завершить себя   -  person MZH    schedule 28.02.2013


Ответы (2)


Это всего лишь предположение, но попробуйте использовать полный путь ко всему, что вы выполняете. Запуск команды из оболочки может работать для ВАШЕЙ учетной записи пользователя, но имейте в виду, что процесс выполняется от имени пользователя apache.

Кроме того, вам может быть полезно использовать exec() с дополнительными параметрами. Третий параметр может указать, где хранить статус возврата команды (вероятно, поможет вам понять это). (предоставлено руководству по PHP)

person thatthatisis    schedule 28.02.2013

Проверьте этот безопасный режим -exec-dir и вам не нужно устанавливать максимальное время выполнения для сценариев командной строки, по умолчанию они не имеют ограничений.

person Gustek    schedule 28.02.2013