2012-02-15 5 views
0

Я пишу PHP-скрипт, который запустит программу на сервере.PHP exec() не возвращается

Я делаю это с:

exec('myAppName'); 

Эта строка кода «работает» в том, что он на самом деле выполняет программу, однако, я не могу получить его, чтобы вернуться (продолжить прошлое) от этой линии.

Он будет просто висеть там, пока я не закрою открытую программу или не превысит max_execution_time.

Я пропустил что-то очевидное?

+0

Вы хотите 'fork', а затем' exec'?Потому что 'exec' не должен каким-то образом« фона »этого процесса. – Borealid

+1

Выстрел в темноте, но попробуйте использовать '' passthru() '] (http://php.net/passthru) вместо' exec() '. Результат программы может что-то показать. –

+0

Пробовал passthru(), а также с тем же результатом. –

ответ

0

процесс в фоновом режиме в PHP, вам нужно сделать что-то вроде этого:

function spawnBackgroundProcess($sProcessLine) 
{ 
    $aPipes = array(); 

    $rProcess = proc_open($sProcessLine, array(), $aPipes); 
    proc_close($rProcess); 
} 

Действительно, что это злоупотребление proc_ * семьи, но это лучший способ, к сожалению.

(Не забудьте &!)

1

manual for exec, не будучи совсем ясно по этому вопросу ожидания запущенной программы для выхода, состояние возвращаемого значения будет

Возвращаемых значений: Последняя строкой из результата команды.

Другими словами, как только вы наблюдаете, чтобы вернуть последний вывод строки, exec не вернется, пока не выйдет запущенная программа.

0

Вам нужно выполнить фоновое изображение, чтобы продолжить работу с остальной частью php, на которую я верю.

В Unix/Linux используйте символ «&». ..

Хм или эта система, которая делает это .. черт возьми, не могу вспомнить сейчас - пойдет снова читать руководство.

+0

Я должен был указать в исходном посте, но я на сервере Windows. –

0

Если вы хотите, чтобы выполнить команду в фоновом режиме, не имея сценария, ожидая результата, вы можете сделать следующее:

<?php 
passthru("/usr/bin/php /path/to/script.php ".$argv_parameter." >> /path/to/log_file.log  2>&1 &"); 
?> 

Там вот несколько вещей, которые здесь важны.

Прежде всего: поместите полный путь к двоичному файлу php, потому что эта команда будет запущена под пользователем apache, и у вас, вероятно, не будет командного псевдонима, такого как php, установленного этим пользователем.

Seccond: обратите внимание на 2 вещи в конце командной строки: '2> & 1' и '&'. '2> & 1' предназначен для перенаправления ошибок в стандартный IO. И самое главное - «&» в конце командной строки, которая сообщает терминалу не ждать ответа.

Третье: Убедитесь, что у вас есть 777 разрешений на файл 'log_file.log'

Enjoy!