在后台从php执行.bat文件

Posted

技术标签:

【中文标题】在后台从php执行.bat文件【英文标题】:execute .bat file from php in background 【发布时间】:2015-03-11 12:42:26 【问题描述】:

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

我的php代码:

if (isset($_POST['test']))

    exec('C:\Daten\test.bat');
    header("Location:test_status.php");

我如何告诉 php 执行者不要等待?

我也尝试了以下方法,但不起作用:

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

【问题讨论】:

你试过pclose(popen("start /B ". $cmd, "r")); ?? from here 其中$cmd 是您要运行的命令。 这可以帮助***.com/questions/649634/… 相关,How do you run a .bat file from PHP? 【参考方案1】:

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

试试

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

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

【讨论】:

关于cmd.exe 的好评与bash 的工作方式不同:-) 无法保证调用cmd.exe(在原始解决方案和此答案中)。 PHP 要求系统执行一个扩展名为.bat 的文件,系统代码查询Windows 注册表并发现.bat 文件被传递给某个命令解释器执行。默认情况下,它是 Windows 的cmd.exe,但可以安装其他命令解释器,并且该解释器可以将自己注册为执行.bat 文件的处理程序。【参考方案2】:

感谢您的回复,但这对我不起作用。我在互联网上找到了很多解决方案的想法,但没有一个对我有用。

现在我终于找到了解决方案! 关键字已打开!这很好用:

$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 关闭它。 (批处理仍在后台运行) 之后,它会打开另一个网站,在我的例子中,它是一个“查看当前状态”网站。

如果你不想要日志,你也可以用 >nul 输出(就像 MarkB 之前所说的那样)。这看起来像这样:

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

并注意路径中的空格! 我不知道为什么,但这不起作用:'start /B "C:\Data Folder\restart_TS3.bat" >nul 2>&1' 在这种情况下,您需要 " 在这样的文件夹中:

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

这适用于文件夹名称中的空白。

【讨论】:

在网上尝试了很多其他解决方案之后——passthru、exec 等......这终于奏效了!谢谢【参考方案3】:

这对我有用。

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

【讨论】:

好答案。很多人不知道在 Windows 中运行exec 时必须在开头包含start 关键字。此外,如果您希望 exec 异步,只需在末尾添加 & 在发布代码时添加对您想要实现的目标的解释总是更好。

以上是关于在后台从php执行.bat文件的主要内容,如果未能解决你的问题,请参考以下文章

如何让bat,cmd文件后台运行?

php怎样执行cmd命令或者bat处理 - 技术问答

Windows服务器上使用bat定时执行php

bat文件怎么运行

Windows服务器上使用bat定时执行php

BAT批处理后台运行的命令是啥?