首页 文章

打开批处理文件php

提问于
浏览
7

在每个人开始接受“安全风险”“无法完成”之前,请停在那里阅读整个帖子

我有一个从家用笔记本电脑设置的网络服务器,它作为游戏网络服务器我试图创建一个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将在运行服务器的笔记本电脑上运行,并将执行所有操作以启动我们的游戏服务器,因此有另一个目录“Instance”包含一个可删除的“Server.exe”批处理文件将运行

我有的问题是运行Web服务器并测试它,如果我直接打开批处理文件它不起作用但它似乎PHP代码不起作用

为了澄清我使用的是apache,我的浏览器是chrome

对于任何愿意回答这条路线的人来说,这只是一个简单的问题是正确的吗?使用php将允许所有内容在托管服务器的计算机上运行,因此最终用户只能看到GUI,服务器将运行批处理文件和Web服务器上的所有内容而不是本地计算机(如果有意义的话)?

编辑:要更清楚正在运行的函数exec运行,但它只是挂起像应用程序正在加载我需要一个实际打开应用程序的解决方案是我的主机,例如,如果我想打开记事本我按一个按钮在Web服务器和记事本将在计算机上打开

编辑2:我想请注意,我不完全 need 使用 exec 功能,我已经尝试了所有的答案日期2017年7月19日:下午3:45没有工作,如果我做的事情 echo exec('start text.bat'); 我会得到一个 This is a test to show your batch is working 而且只是在批处理文件中只有 echo ..... 我遇到的主要问题是服务器没有物理显示打开的文件,比如显示GUI让我们以记事本为例

我可以打开记事本并获得一些返回值,只要我的批处理文件一旦完成运行就关闭记事本,但记事本的GUI从未显示,这非常重要

我在一些关于使用apache作为服务的文章中读到了我很确定我的但是我知道xaammp有足够的priveleges并且我已经选中了“允许apache与桌面交互”的框,但是没有GUI弹出那些我想我试图通过的主要观点是我需要显示GUI而不仅仅是打开文件作为后台服务 .

如果它使回答变得更容易,那么我愿意切换编程语言,如果能够做到我想要的更容易的话

8 回答

  • 0

    关于exec函数的php手册,有一个注释:

    注意:如果程序是使用此功能启动的,为了使程序继续在后台运行,程序的输出必须重定向到文件或其他输出流 . 如果不这样做将导致PHP挂起,直到程序执行结束 .

    我认为“挂起就像应用程序正在加载”是你的应用程序等待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');
    
  • 0

    你的理论是正确的,它将在服务器上运行,但你可能有问题直接从php运行应用程序(这种方法afaik它不会脱离PHP,并且webapp“挂起”应用程序运行时) .

    确保:打印/记录返回值 . 只是一个

    <?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');
    }
    ?>
    

    如果您没有任何响应,请尝试使用带有“hello world”的简单批处理文件来测试它是否有效 .

    请注意,权限和限制来自php环境,批处理文件继承了运行PHP代码/ Apache的相同权限(如果是mod_php)

  • 0

    从这里:

    How do you run a .bat file from PHP?

    你试过了吗? system("cmd /c C:[path to file]");

  • 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 意味着蝙蝠将在后台执行,因此在运行该行后,其余的php将继续运行,而 $str = exec('start /B /C command', $result); 执行 command ,然后存储 result 供以后使用 .

    <?php
     pclose(popen("start /B test.bat", "r")); die();
    ?>
    
  • 0

    我认为这是一个遏制问题 .

    如果你在php终止时在iiswebuser运行php的过程中运行应用程序,它将关闭windows中所有生成的子进程 . 有一个非常快捷的命令可以打破使用start命令从子进程包含中删除应用程序 .

    if(isset($_POST['startServer'])){
        exec('start batch/startServer.bat');
    }
    

    我解释它的遏制图(简单化)

    • IIS(IIS作为IISUser运行)

    • php(应用程序)

    • cmd.exe(批处理)

    使用start将它带到该树的根目录

    • IIS(IIS作为IISUser运行)

    • php(应用程序)

    • cmd.exe(批处理)

  • 0

    Baim Wrong在响应的第一部分是正确的:您必须重定向脚本的输出,否则您的PHP代码将挂起 . 此外,您必须在后台移动进程 .

    这在* nix上很容易做到:

    system("/usr/local/bin/shell.sh >> /tmp/log.log 2>&1 &");
    

    我知道你可以在Windows上重定向输出,但不知道如何在后台移动进程 . 您应该检查DOS手册或尝试使用power shell .

  • 3

    你可以使用 systemexec php函数

    $path = __DIR__ . '/batch/startServer.bat';
    exec('cmd /c start ' . $path);
    

    要么

    $path = __DIR__ . '/batch/startServer.bat';
    $lastLine = system('cmd /c start ' . $path);
    
  • 1

    您有一些关于直接从exec运行应用程序的问题 . 我有同样的问题使用exec运行文件 . 它通过传递另一个参数2>&1来解决 .

    exec('some_command 2>&1', $output);
    print_r($output);  // to see the response to your command
    

    检查输出see exec function打印的值

    <?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";
    }
    ?>
    

相关问题