2010-12-10 8 views
1

私はプログラムを実行するためにいくつかのPHPスクリプトを書いており、STDOUTをキャプチャし、終了時にリターンコードをキャプチャします。これらのプログラムは即座に復帰するか、20分で終了する可能性があるため、終了するタイミングを監視する必要があります。バックグラウンドでプログラムを実行し、リターンコード(phpとwindows)をキャプチャします

プログラムをバックグラウンドで起動し、[外部ログファイルに]リターンコードを取得する方法が見つかりません。もし私が単にexecやproc_openを使うと、私のPHPスクリプトはブロックされます。

リターンコードを取得できない場合でも、プロセスがいつ終了したかを知る必要があります。私はexec("start my.exe");を使用し、STDOUTをキャッチすることができます

を(私の代わりにSTDOUTにエラーコードを置くことができます)、私はリターンコードを取得していない(そしてそれが終わっていますときにも知らない)私が考えた

をすることができますバッチファイルで実行し、バッチファイルでリターンコードをキャッチしますが、私のコマンドラインには動的オプションがあります。
exec("start cmd \"echo hello\");

編集:しかし、私は、動的に、コマンドライン上のバッチコマンドのリストを作成する方法を発見していませんでした。誰かがアプローチを知っていれば、私はとても感謝しています。 Executing background processes from PHP on Windows
cmd /C "echo hello"は、クロスプラットフォーム、厳密に窓(XP-7)

+0

リターンコードで何をお探しですか?それをウェブサイトに出力しますか? –

+0

ええ、私はエラーと次の段階を決定するためにリターンコードを使用します。しかし、それはプロセスが終了したことを私に伝える役割も果たします。 –

答えて

1

はこれを見て持っている必要はありません。この

を解決します。それはいくつかの可能性を説明します。

0

これは私が今までに得たところです。私は動的なバッチファイルが必要ないと思った、私はargs(duh)を供給することができます。 だから、僕は exec("start Batch.bat log.txt stdout.txt c:\my.exe a b c"); を呼び出し、(私が今そうであるように)

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 http://stackoverflow.com/questions/761615/is-there-a-way-to-indicate-the-last-n-parameters-in-a-batch-file 
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コードのいくつかAjaxでログファイルを監視することができます。

$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"; 

* EDIT:*おっと、EXEC()でも開始してバックグラウンドで起動しません。それでも、私の他の問題を解決しました...

+0

明らかに、%ERRORLEVEL%ではなくERRORLEVELである必要があります。http://blogs.msdn.com/b/oldnewthing/archive/2008/09/26/8965755.aspx –

関連する問題