在后台从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文件的主要内容,如果未能解决你的问题,请参考以下文章