【问题标题】:execute .bat file from php in background在后台从php执行.bat文件
【发布时间】: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 &');

【问题讨论】:

标签: php windows batch-file background cmd


【解决方案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 异步,只需在末尾添加 &
  • 在发布代码时添加对您想要实现的目标的解释总是更好。
猜你喜欢
  • 2010-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多