【问题标题】:Start java executable via PHP on windows在 Windows 上通过 PHP 启动 java 可执行文件
【发布时间】:2018-12-24 21:05:01
【问题描述】:

我尝试通过 PHP 启动一个 java 文件。我创建了一个名为 start_selenium_server.bat 的 .bat 文件。

这是内容:java -jar -Dwebdriver.gecko.driver="drivers/geckodriver.exe" selenium-server-standalone-3.4.0.jar -port 4444

文件夹drivers和我的项目根目录下的.bat文件在同一个文件夹中。

文件selenium-server-standalone-3.4.0.jar也在同一目录下。

这就是我尝试启动它的方式:

    $out = array();
    $outvar = "";
    exec("start_selenium_server.bat", $out, $outvar);

    if ($outvar == 0) {
        return redirect()->back()->with("message", "Selenium Server wurde gestartet.")
                                 ->with("status", "success");
    } else {
        return redirect()->back()->with("message", "Selenium Server konnte nicht gestartet werden!")
                                 ->with("status", "error");
    }

但网站只是永远加载,没有任何反应。

编辑:我注意到在任务管理器中生成了一个cmd.execonhost.exe 任务。

【问题讨论】:

    标签: java php wamp


    【解决方案1】:

    这对我来说似乎是合乎逻辑的,服务器启动,运行,并且没有结束。

    您可能只想使用& 将进程置于后台。

    exec("/path/to/script &");
    

    当然,您使用的是 Windows,这带来了一系列令人头疼的问题。我给你的解决方案是基于 Linux 的系统(默认的预期配置),所以你必须找出如何让 windows 可执行文件在后台运行。

    更新

    我刚刚看了一眼,发现了这个:

    START /B program
    

    所以我认为你需要的是:

    exec('START /B start_selenium_server.bat');
    

    当然,这样做的缺点是您的系统现在与 Windows 耦合。

    另一个更新

    这应该适用于 Linux 和 Windows。请注意,我们不会在 Windows 中使用 exec,因此请尝试一下!

    if (substr(php_uname(), 0, 7) == "Windows"){ 
         pclose(popen("start /B ". $cmd, "r"));  
     } 
     else { 
         exec($cmd . " > /dev/null &");   
     }
    

    【讨论】:

    • 不幸的是它仍然永远加载。
    【解决方案2】:

    我使用proc_open解决了这个问题。

        $descriptorspec = array(
           0 => array("file", "tmp/stdin.log", "a"),
           1 => array("file", "tmp/stdout.log", "a"),
           2 => array("file", "tmp/stderr.log", "a")
        );
    
        $process = proc_open ('START /B start_selenium_server.bat', $descriptorspec, $pipes);
    
       if (is_resource($process)) {
    
            $response = proc_close($process);
    
    
            if ($response == 0) {
                return redirect()->back()->with("message", "Kommando wurde ausgeführt.")
                                         ->with("status", "success");
            } else {
                return redirect()->back()->with("message", "Error !")
                                         ->with("status", "warning")
            }
    
        }
    

    服务器现在启动,但我需要改进此代码以检查它是否成功并将其显示给用户。

    【讨论】:

      猜你喜欢
      • 2017-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-14
      • 1970-01-01
      • 2021-05-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多