在后台执行程序,并捕获返回代码(php和windows)

在后台执行程序,并捕获返回代码(php和windows),php,windows,batch-file,Php,Windows,Batch File,我正在编写两个PHP脚本来执行一个程序,捕获它的标准输出,并在它完成时捕获返回代码。这些程序可以立即返回,或者在20分钟内完成,所以我需要监视它们何时完成 我找不到在后台启动程序并捕获返回代码[到外部日志文件]的方法。如果我简单地使用exec或proc_open,我的php脚本将被阻塞,当这个过程需要20分钟时,这是不好的 即使我无法捕获返回代码,我也需要知道流程何时完成。(我可以在标准输出中输入错误代码) 我可以使用exec(“启动我的.exe”)并捕获STDOUT,但我无法获取返回代码(也不

我正在编写两个PHP脚本来执行一个程序,捕获它的标准输出,并在它完成时捕获返回代码。这些程序可以立即返回,或者在20分钟内完成,所以我需要监视它们何时完成

我找不到在后台启动程序并捕获返回代码[到外部日志文件]的方法。如果我简单地使用exec或proc_open,我的php脚本将被阻塞,当这个过程需要20分钟时,这是不好的

即使我无法捕获返回代码,我也需要知道流程何时完成。(我可以在标准输出中输入错误代码)

我可以使用
exec(“启动我的.exe”)
并捕获STDOUT,但我无法获取返回代码(也不知道何时完成)

我曾想过通过批处理文件
exec(start my.bat)来实现这一点并在批处理文件中捕获返回代码,但我的命令行具有动态选项,因此我非常愿意执行以下操作:
exec(“start cmd\“echo hello\”);

编辑:但我还没有找到在命令行上动态生成批处理命令列表的方法。如果有人知道一种方法,我将不胜感激。
cmd/C“echo hello”
就是解决这个问题的方法


不需要跨平台,严格说来,windows(xp-7)

看看这个:。它解释了一些可能性。

看看这个:。它解释了一些可能性。

好的,这就是我到目前为止所做的。我想我不需要动态批处理文件,我只需要提供args(duh)。 这样我就可以打电话了
exec(“start Batch.bat log.txt stdout.txt c:\my.exe a b c”);
并使用一些ajax监控日志文件(就像我现在做的那样)

以及调用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()即使使用start也不会在后台启动。不过,解决了我的其他问题…

好吧,这就是我到目前为止所做的。我想我不需要动态批处理文件,我只需要提供args(duh)。 这样我就可以打电话了
exec(“start Batch.bat log.txt stdout.txt c:\my.exe a b c”);
并使用一些ajax监控日志文件(就像我现在做的那样)

以及调用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";  

*编辑:*Oops,exec()即使使用start,也不会在后台启动。不过,解决了我的其他问题…

您希望如何处理返回代码?将其输出到网站上?是的,我使用返回代码确定错误和下一阶段。但它还可以告诉我过程已完成。您希望如何处理返回代码?输出I是的,我使用返回码来确定错误和下一阶段。但它也可以告诉我过程已经完成。显然,这应该是ERRORLEVEL而不是%ERRORLEVEL%。显然,这应该是ERRORLEVEL而不是%ERRORLEVEL%