Выполнить программу в фоновом режиме и захватить код возврата (php & windows) - PullRequest
1 голос
/ 10 декабря 2010

Я пишу пару сценариев PHP для выполнения программы, захвата ее STDOUT и захвата кода возврата, когда она завершится.Эти программы могут возвращаться мгновенно или завершаться через 20 минут, поэтому мне нужно следить за их завершением.

Я не могу найти способ запустить программу в фоновом режиме и записать код возврата [на внешнийжурнальный файл].Если я просто использую exec или proc_open, мой php-скрипт заблокируется, что бесполезно, когда процесс занимает 20 минут.

Даже если я не могу захватить код возврата, мне нужно знать, когда процессзакончил(Вместо этого я могу поместить коды ошибок в STDOUT)

Я могу использовать exec("start my.exe"); и перехватить STDOUT, но не могу получить код возврата (и также не знаю, когда он закончится)

Я думал сделать это через пакетный файл exec(start my.bat);, и в пакетном файле перехватить код возврата, но моя командная строка имеет динамические параметры, поэтому я вполне могу сделать что-то вроде;
exec("start cmd \"echo hello\");

Редактировать: Но я не нашел способа динамически создать список команд в командной строке.Если кто-нибудь знает подход, я был бы очень признателен.
cmd /C "echo hello" является решением этой проблемы

Не обязательно быть кроссплатформенным, строго Windows (XP-7)

Ответы [ 2 ]

1 голос
/ 10 декабря 2010

Взгляните на это: Выполнение фоновых процессов из PHP в Windows .Это объясняет некоторые возможности.

0 голосов
/ 10 декабря 2010

Хорошо, это то, куда я дошел до сих пор. Я подумал, что мне не нужен динамический пакетный файл, я могу просто предоставить аргументы (да). Так что я могу просто позвонить exec("start Batch.bat log.txt stdout.txt c:\my.exe a b c"); и контролировать файлы журналов с помощью некоторого ajax (как я делаю сейчас)

REM first 2 params are log filenames
set LogFilename=%1
shift
set StdOutFilename=%1
shift

REM Code to concatonate all following params from here
REM /655856/est-li-sposob-ukazat-poslednie-n-parametrov-v-paketnom-faile
set params=%1
:loop
shift
if [%1]==[] goto afterloop
set params=%params% %1
goto loop
:afterloop

REM command line is everything after the log-filename param
set CommandLine=%params%
@echo log: %LogFilename%
@echo stdout: %StdOutFilename%
@echo command: %CommandLine%

if ["%LogFilename%"]==[]        exit 255;
if ["%StdOutFilename%"]==[] exit 254;
if ["%CommandLine%"]==[]        exit 253;

REM execute command hidden(/B), wait for it to finish so we can get the return code (/WAIT) and output to stdlog
@start /B /WAIT %CommandLine% >> %StdOutFilename%

REM log return code "RET X"
@echo RET %ERRORLEVEL% >> %LogFilename%

И вызывающий код PHP;

$BatchCommandLine = "start /D $Cwd /B /WAIT execute.bat $LogName %StdLogName $Exe $Params";  
$OutputLine = exec( $BatchCommandLine, $Output, $ReturnCode );  
if ( $ReturnCode != 0 )  
echo "Batch file failed to execute";  

* РЕДАКТИРОВАТЬ: * Упс, exec () не запускается в фоновом режиме даже при запуске. Тем не менее, решил другие мои проблемы ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...