在每个人开始接受"安全风险之前" "不能完成"停在那里阅读整篇文章
我有一个家用笔记本电脑设置的网络服务器,它作为游戏网络服务器我试图创建一个GUI,所以我们更容易维护服务器,我试图使用批处理文件来执行操作计算机
因此,为了正确看待我的索引文件index.php
<form method="post">
<input type="submit" name="startServer" value="Start Server">
</form>
<?
if(isset($_POST['startServer'])){
exec('batch/startServer.bat');
}
?>
我的startServer.bat将在运行服务器的笔记本电脑上运行,并将执行所有操作以启动我们的游戏服务器,因此有另一个目录&#34; Instance&#34;包含一个可删除的&#34; Server.exe&#34;哪个批处理文件将运行
我正在运行Web服务器并测试它的问题如果我直接打开批处理文件它不起作用但它似乎PHP代码无法正常工作
为了澄清我正在使用apache而我的浏览器是chrome
对于任何愿意回答这条路线的人来说,只是一个简单的问题是正确的吗?使用php将允许所有内容在托管服务器的机器上运行,这样最终用户只能看到GUI,服务器会运行批处理文件和Web服务器上的所有内容,而不是本地机器上的内容,如果这有意义的话?
编辑:要更清楚地知道函数exec运行的是什么,但它只是挂起就像应用程序正在加载我需要一个实际打开应用程序的解决方案是我的主机,例如,如果我想打开记事本我按下Web服务器上的按钮,记事本将在计算机上打开编辑2:我想请注意,我并不完全 需要 来使用exec
功能,我已经尝试了所有答案到日期7 / 19/2017:3:45 pm如果我在某些事情上做了什么工作echo exec('start text.bat');
我会得到一个This is a test to show your batch is working
而在批处理文件中只有echo .....
我遇到的主要问题是服务器没有物理显示打开的文件,如显示GUI,让我们只拿记事本
我可以打开记事本并获得一些返回值,只要我的批处理文件在完成运行后关闭记事本,但记事本的GUI从未显示,这非常重要
我在一些文章中读到了关于使用apache作为服务的信息,我很确定我是,但我知道xaammp有足够的priveleges并且我已经选中了“#34;允许apache与桌面交互&#34”的方框;然而,没有GUI弹出,这就是我想我想要实现的主要观点是我需要显示GUI而不仅仅是将文件作为后台服务打开。
如果它能让答案变得更容易,那么我愿意切换编程语言,如果能够做到我想要的更容易的话
答案 0 :(得分:3)
你的理论是正确的,它将在服务器上运行,但是你可能直接从php运行应用程序时遇到问题(这种方法不会脱离PHP,而且webapp&#34;挂起&#34;而应用程序正在运行。)
确保:打印/记录返回值。只是一个
<?php
if(isset($_POST['startServer'])){
echo exec('batch/startServer.bat');
}
?>
可以指出正确的方向。可能已在您的发行版中禁用了exec功能。
使用
<?php
而不是
<?
强烈建议,默认情况下,大多数发行版(wamp,xamp等)都没有启用short_tags。
设置调试模式并打印所有内容以获取有关问题的信息:
<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
if(isset($_POST['startServer'])){
echo exec('batch/startServer.bat');
}
?>
如果您没有任何回复,请尝试一个简单的批处理文件,其中包含&#34; hello world&#34;测试它是否有效。
请注意,权限和限制来自php环境,批处理文件继承了运行PHP代码/ Apache的相同权限(如果是mod_php)
答案 1 :(得分:1)
在关于exec功能的php手册中,有一个注释:
注意:如果程序是使用此功能启动的,则为了它 继续在后台运行,程序的输出必须是 重定向到文件或其他输出流。没有这样做会 导致PHP挂起,直到程序执行结束。
我认为&#34;挂起就像应用程序正在加载&#34;是你的应用程序等待bat文件终止/关闭以获得输出结果
让我们尝试另一种方法,我发现它here,其概念是创建一个执行所需程序的调度程序,并使用命令调用它。
希望这有帮助:shell_exec('SCHTASKS /F /Create /TN _notepad /TR "notepad.exe" /SC DAILY /RU INTERACTIVE');
shell_exec('SCHTASKS /RUN /TN "_notepad"');
shell_exec('SCHTASKS /DELETE /TN "_notepad" /F');
答案 2 :(得分:0)
答案 3 :(得分:0)
您可能需要通过cmd,
运行它,例如:
system("cmd /c C:[path to file]");
或尝试以下选项
1
<?php
exec('c:\WINDOWS\system32\cmd.exe /c START C:\Program Files\VideoLAN\VLC\vlc.bat');
?>
2
当您使用exec()
功能时,就好像您打开了一个cmd终端并直接输入命令。
使用这样的单引号$str = exec('start /B Path\to\batch.bat');
/B
表示将在后台执行bat,所以php的其余部分将在运行该行后继续,而不是$str = exec('start /B /C command', $result);
执行command
然后result
存储以供以后使用。
<?php
pclose(popen("start /B test.bat", "r")); die();
?>
答案 4 :(得分:0)
我认为这是一个遏制问题。
如果你在php终止的php运行php的过程中运行应用程序,当php终止时,它将关闭windows中所有生成的子进程。使用start
命令可以非常快速地将应用程序从子进程包含中分离出来。
if(isset($_POST['startServer'])){
exec('start batch/startServer.bat');
}
我解释的遏制图(简单地说)
使用start将其带到该树的根目录
答案 5 :(得分:0)
varun在响应的第一部分是正确的:您必须重定向脚本的输出,否则您的PHP代码将挂起。此外,您必须在后台移动进程。
这很容易在* nix上进行:
system("/usr/local/bin/shell.sh >> /tmp/log.log 2>&1 &");
我知道你可以在Windows上重定向输出,但不知道如何在后台移动进程。您应该检查DOS手册或尝试使用power shell。
答案 6 :(得分:0)
您可以使用system
或exec
php函数
$path = __DIR__ . '/batch/startServer.bat';
exec('cmd /c start ' . $path);
或
$path = __DIR__ . '/batch/startServer.bat';
$lastLine = system('cmd /c start ' . $path);
答案 7 :(得分:0)
你有一些关于直接从exec运行应用程序的问题。我有同样的问题使用exec运行文件。它通过传递另一个参数2&gt;&amp; 1来解决。
exec('some_command 2>&1', $output);
print_r($output); // to see the response to your command
打印的值
<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
$output = array();
if(isset($_POST['startServer'])){
exec('batch/startServer.bat 2>&1', $output);
print_r($output);
} else {
echo "Not posted";
}
?>