2010-12-10 73 views
1

我正在編寫幾個PHP腳本來執行程序,捕獲它的STDOUT並在完成時捕獲返回代碼。這些程序可能會立即返回,或在20分鐘內完成,因此我需要在完成時進行監控。在後臺執行程序,並捕獲返回代碼(php和windows)

我找不到在後臺啓動程序並捕獲[外部日誌文件]返回代碼的方法。如果我簡單地使用exec或proc_open,我的php腳本就會被阻塞,當這個過程需要20分鐘時,這是不好的。

即使我無法捕獲返回碼,我需要知道該過程何時完成。 (我可以把錯誤代碼顯示在輸出代替)

我可以使用exec("start my.exe");,趕上STDOUT,但我不能讓返回代碼(還有不知道什麼時候,它的完成)

我想過通過批處理文件exec(start my.bat);並在批處理文件中捕獲返回代碼,但我的命令行有動態選項,所以我寧願做類似的事情;
exec("start cmd \"echo hello\");

編輯:但我還沒有找到一種方法來在命令行上動態生成批處理命令列表。如果有人知道一種方法,我會非常感激。
cmd /C "echo hello"是解決這一

不需要跨平臺,嚴格窗口(XP-7)

+0

你在做什麼與返回代碼?在網站上輸出它? – 2010-12-10 11:17:41

+0

是的,我使用返回碼來確定錯誤和下一個階段。但它也可以告訴我這個過程已經完成。 – 2010-12-10 11:41:36

回答

0

好的,這是我到目前爲止的地方。我想我不需要一個動態的批處理文件,我只能提供參數(杜)。 這樣我就可以叫 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 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代碼;

$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()不會在後臺甚至開始推出。仍然,解決了我的其他問題...

+0

很明顯,應該是ERRORLEVEL而不是%ERRORLEVEL%http://blogs.msdn.com/b/oldnewthing/archive/2008/09/26/8965755.aspx – 2010-12-10 14:50:39