优雅的DOS命令错误处理

时间:2010-04-05 20:11:58

标签: php windows error-handling dos

Windows 2003上的PHP 5.2.13

我正在使用DOS Start / B命令使用PHP popen()函数启动后台应用程序:

popen("start /B {$_SERVER['HOMEPATH']}/{$app}.exe > {$_SERVER['HOMEPATH']}/bg_output.log 2>&1 & echo $!", 'r');

popen()函数启动运行指定命令的cmd.exe进程;但是,如果命令失败(例如{$ app} .exe不存在或在上面的示例中被锁定),则cmd.exe进程永远不会返回,因此PHP会无限期挂起。

使用命令提示符直接调用失败的DOS命令会导致错误提示,需要单击“确定”按钮。

我认为这个错误确认要求是阻止cmd.exe进程从命令提示符(使用CGI和CLI)和Web(使用Apache 2.0处理程序w / Apache 2.2)返回PHP的原因。

有没有办法编写DOS命令或配置服务器或cmd.exe应用程序本身将DOS错误返回到原始调用而不是等待确认?

2 个答案:

答案 0 :(得分:0)

来自手册:http://php.net/manual/en/function.popen.php

  

如果要执行的命令可以   找不到,有效的资源是   回。这可能看起来很奇怪,但是有所作为   感;它允许您访问任何   shell返回的错误消息:

error_reporting(E_ALL);

/* Add redirection so we can get stderr. */
$handle = popen('/path/to/executable 2>&1', 'r');
echo "'$handle'; " . gettype($handle) . "\n";
$read = fread($handle, 2096);
echo $read;
pclose($handle);

答案 1 :(得分:0)

您是否尝试过cmd.exe /c ...而不是start /b