2015-01-13 98 views
0

我尝试在后台执行php中的.bat文件(带有xampp的Windows Server)。当我点击按钮后,它也应该去另一个网站。 但是当我点击按钮时,浏览器正在等待脚本完成。大多数情况下,这是以超时结束。从后台执行.bat文件

我的PHP代码:

if (isset($_POST['test'])) 
{ 
    exec('C:\Daten\test.bat'); 
    header("Location:test_status.php"); 
} 

我怎么能告诉PHP EXEC,以不等待?

我也试过以下,但不工作:

exec('C:\Daten\test.bat' . '> /dev/null &'); 
+0

你试过'pclose函数(POPEN( “开始/ B”。$ CMD, “R”) );'[from here](http://php.net/manual/en/function.exec.php#86329)其中'$ cmd'是你想运行的命令。 – MoshMage

+0

这可以帮助http://stackoverflow.com/questions/649634/how-do-i-run-a-bat-file-in-the-back-from-another-bat-file –

+0

相关,[你怎么样从PHP运行一个.bat文件?](http://stackoverflow.com/q/835941) – jww

回答

1

你使用的是Windows。在Windows中没有/dev/null(这只是nul),并且没有&在后台运行作业。 cmd.exe中的&是一个命令分隔符。所以你的exec()会挂起/等待.bat完成。

尝试

exec('start c:\daten\test.bat'); 

代替,这将启动批处理文件作为一个单独的进程。

+0

有关'cmd.exe'的好评如果'bash'不能以同样的方式工作:-) – axiac

+0

不能保证'调用cmd.exe'(在原始解决方案和此答案上)。 PHP要求系统执行一个扩展名为'的文件。bat',系统代码会咨询Windows注册表并发现'.bat'文件被传递给某个命令解释器以供执行。默认情况下,它是Windows的'cmd.exe',但可以安装其他命令解释器,并且解释器可以将自己注册为执行'.bat'文件的处理程序。 – axiac

0

感谢您的回复,但这并不适合我。我在互联网上发现了许多解决方案的想法,但没有为我工作。

现在我终于找到了解决方案! 关键字是popen!这工作不错:

$handle = popen ('start /B C:\Data\restart_TS3.bat > C:\Daten\restart_TS3.log 2>&1', 'r'); 
pclose ($handle); 
header("Location:ts3_status.php"); 

此做如下: POPEN打开启动该批处理文件,输出去日志文件的后台进程。 然后你需要用pclose关闭它。 (该批次仍在后台运行) 之后,它打开另一个网站,在我的情况下它是一个“查看当前状态”网站。

如果你不想要一个日志,你也可以输出(比如MarkB之前告诉过的)> nul。这看起来是这样的:

$handle = popen ('start /B C:\Data\restart_TS3.bat >nul 2>&1', 'r'); 

并注意路径中的空白空间! 我不知道为什么,但是这是不行的: '开始/ B “C:\ Data文件夹\ restart_TS3.bat”> NUL 2> & 1' 在您需要的“文件夹中的一样,那情况:

$handle = popen ('start /B C:\"Data Folder"\restart_TS3.bat >nul 2>&1', 'r'); 

这正常工作与空的空间在文件夹名称。

0

这为我工作。

exec("start cmd /c test.bat", $output); 
var_dump($output); 
+0

很好的答案。许多人不知道在Windows中,运行'exec'时必须在开始处包含'start'关键字。另外,如果你希望你的'exec'是异步的,只需在末尾添加一个'&'。 –

+0

在发布代码时,添加对尝试实现的内容的解释总是更好。 –