在后台从php执行.bat文件

在后台从php执行.bat文件,php,windows,batch-file,background,cmd,Php,Windows,Batch File,Background,Cmd,我尝试在后台从php执行一个.bat文件(带有xampp的Windows服务器)。在我点击按钮后,它也应该转到另一个网站。 但当我点击按钮时,浏览器正在等待脚本完成。大多数情况下,这是以超时结束的 我的php代码: if (isset($_POST['test'])) { exec('C:\Daten\test.bat'); header("Location:test_status.php"); } 我如何告诉php执行者不要等待 我还尝试了以下操作,但不起作用: exec('

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

我的php代码:

if (isset($_POST['test']))
{
    exec('C:\Daten\test.bat');
    header("Location:test_status.php");
}
我如何告诉php执行者不要等待

我还尝试了以下操作,但不起作用:

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

你正在使用Windows。Windows中没有
/dev/null
(它只是
nul
),也没有
&
在后台运行作业&是一个命令分隔符。因此,exec()将挂起/等待.bat完成

试一试


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

您正在使用Windows。Windows中没有
/dev/null
(它只是
nul
),也没有
&
在后台运行作业&是一个命令分隔符。因此,exec()将挂起/等待.bat完成

试一试


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

谢谢你的回复,但这对我来说不起作用。我在互联网上发现了很多解决方案,但对我来说什么都不管用

exec("start cmd /c test.bat", $output);
var_dump($output);
现在我终于找到了解决办法! 关键词是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关闭它。(批处理仍在后台运行) 之后,它会打开另一个网站,在我的例子中,它是一个“查看当前状态”的网站

如果不需要日志,还可以使用>nul输出(如MarkB之前所述)。这看起来是这样的:

$handle = popen ('start /B C:\Data\restart_TS3.bat >nul 2>&1', 'r');
$handle = popen ('start /B C:\"Data Folder"\restart_TS3.bat >nul 2>&1', 'r');
小心道路上的空隙! 我不知道为什么,但这不起作用:'start/B“C:\Data Folder\restart\u TS3.bat“>nul 2>&1” 在这种情况下,您需要在文件夹中输入“文件”,如下所示:

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

这对文件夹名称中的空白空间很有效。

谢谢您的回复,但这对我不起作用。我在互联网上找到了许多解决方案,但对我来说没有任何效果

exec("start cmd /c test.bat", $output);
var_dump($output);
现在我终于找到了解决办法! 关键字是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关闭它。(批处理仍在后台运行) 之后,它会打开另一个网站,在我的例子中,它是一个“查看当前状态”的网站

如果不需要日志,还可以使用>nul输出(如MarkB之前所述)。如下所示:

$handle = popen ('start /B C:\Data\restart_TS3.bat >nul 2>&1', 'r');
$handle = popen ('start /B C:\"Data Folder"\restart_TS3.bat >nul 2>&1', 'r');
小心道路上的空隙! 我不知道为什么,但这不起作用:'start/B“C:\Data Folder\restart\u TS3.bat“>nul 2>&1” 在这种情况下,您需要在文件夹中输入“文件”,如下所示:

$handle = popen ('start /B C:\Data\restart_TS3.bat >nul 2>&1', 'r');
$handle = popen ('start /B C:\"Data Folder"\restart_TS3.bat >nul 2>&1', 'r');
这对文件夹名称中的空白很好。

这对我来说很有效

exec("start cmd /c test.bat", $output);
var_dump($output);
这对我有用

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

您是否尝试过pclose(popen(“start/B”。$cmd,“r”)??其中,
$cmd
是您要运行的命令。这可能会有帮助,您是否尝试过
pclose(popen(“start/B”。$cmd,“r”)??其中,
$cmd
是您要运行的命令。这可能有助于对
cmd.exe
工作方式与
bash
不同的相关评论:-)不能保证调用
cmd.exe
(在原始解决方案和此答案上)。PHP要求系统执行扩展名为
.bat
的文件,系统代码查阅Windows注册表,发现
.bat
文件被传递给某个命令解释器执行。默认情况下,它是Windows的
cmd.exe
,但可以安装其他命令解释器,解释器可以将自己注册为执行
.bat
文件的处理程序。关于
cmd.exe
bash
工作方式不同的好评论:-)不能保证调用
cmd.exe
(关于原始解决方案和此答案).PHP要求系统执行扩展名为
.bat
的文件,系统代码查阅Windows注册表,发现
.bat
文件被传递给某个命令解释器执行。默认情况下,它是Windows'
cmd.exe
,但可以安装其他命令解释器,解释器可以注册r本身就是执行
.bat
文件的处理程序。答案很好。许多人不知道,在Windows中,在运行
exec
时,必须在开头包含
start
关键字。此外,如果希望
exec
是异步的,只需在末尾添加
&
。最好添加一个解释关于您在发布代码时试图实现的目标。回答得好。许多人不知道在Windows中,在运行
exec
时必须在开始处包含
start
关键字。此外,如果您希望
exec
是异步的,只需在末尾添加
&
。最好添加一个解释在发布代码时,您正在尝试实现。在尝试加载网络上的其他解决方案后-passthru、exec等…这终于成功了!感谢在尝试加载网络上的其他解决方案后-passthru、exec等…这终于成功了!谢谢