【问题标题】:Execute java class in PHP在 PHP 中执行 java 类
【发布时间】:2023-03-21 14:20:01
【问题描述】:

我想调用一个 java 程序并在标准输出中获取它的输出。我遵循了stackoverflow 中的建议。但它不起作用。

我已将类文件添加到我的 CLASSPATH。我可以正确执行cmd中的命令如下:

在我的 PHP 文件中,我将这个程序称为

exec("java Hello", $output);
print_r($output);

它只产生:

Array()

有什么问题?我该如何解决这个问题?

ps: Hello 是一个演示程序,实际上我要调用的程序要复杂得多,在我的机器(i5 4G)上可能需要 2 秒或更长时间。

【问题讨论】:

  • 试试看passthru() 回馈什么(而不是exec())。 exec() 有时可能会选择性地仅捕获返回的值而不是打印的内容。使用escapeshellarg() 保护您的脚本免受黑客攻击。
  • @Allendar passthru 返回返回值?反正浏览器给1
  • 如果您的 JAVA 程序中的 main() 函数返回 1(返回 0 = 没有错误,1 = 有问题;))这意味着有一个错误。 PHP 的命令行无法像在cmd 中那样获取您的 JAVA,这可能与此有关。两者当然是不同的设置。就像cakil 回答的那样,它可能会在您返回的 Array() 上循环,因为默认情况下 PHP 中的 echo/print 不会显示 Array 的内部,就像您在其他语言中可能习惯的那样。
  • @Allendar 谢谢,我仔细检查了返回的数组以确保我没有遗漏任何内容,但它是空的。而passthru 实际上没有提供任何比1 更重要的信息,我说1 因为我错误地设置了课程。无论如何,谢谢你。如果这无论如何都不起作用,我也可以尝试将其包装在 jsp 文件或其他一些服务器脚本语言中。我只是想让它在线,以便用户可以访问 java 程序处理后的数据。最坏的情况是我必须将 java 程序翻译成 PHP 或其他服务器脚本语言...
  • 尝试将return 0; 放在您的JAVA 类中,至少测试passthru() 是否并不总是返回1。它应该读取RAW-input,因此调用JAVA 从PHP 脚本。也许(测试)也尝试从它的绝对路径执行 JAVA。你测试的越多,你就会越了解:)

标签: java php


【解决方案1】:

我建议使用此处找到的 Java/PHP 桥:http://php-java-bridge.sourceforge.net/pjb/ 它很容易安装并且效果很好。

另外,我建议使用以下链接下载它。 (与下载->文档中的链接相同)

http://sourceforge.net/projects/php-java-bridge/files/Binary%20package/php-java-bridge_6.2.1/php-java-bridge_6.2.1_documentation.zip/download

文件是JavaBridge.war。您可能希望将 Tomcat 用于 Java EE 容器。设置 Tomcat 后,您只需将此文件放入 webapps 文件夹即可安装。

如果你想经常在 PHP 中使用 java 类,这是我所知道的最好的方法,我已经尝试了很多。 Resin 也可以,但它不能很好地与我的邮件服务器配合使用。

【讨论】:

    【解决方案2】:

    试试这个:

    exec('java -cp .:/path/to/folder/of/your/file Hello 2>&1', $output);
    print_r($output);
    

    2>&1 需要显示错误。

    【讨论】:

      【解决方案3】:

      嗯,它产生数组对吗?所以改为print_r($output) 尝试print($output[0]),在我的控制台上输出“Hello World”:D

      【讨论】:

      • 实际上它产生空数组,因为print_r() 递归打印数组中的内容。我确实尝试了 print($output[0]),它也没有给出任何结果。
      • 嗯,我很好奇你的hello world程序的内容。我的很简单,只是System.out.print("Hello World");,在主程序中
      • 我也是。如上图所示,它在 cmd 中运行良好,并给出了正确的结果。
      • 嗯,和你一样的问题,还没有解决:stackoverflow.com/questions/12448915/…可能是某种bug,或者在执行php时尝试更高的权限?
      【解决方案4】:

      试试pipe

      $command = 'java Hello';
      $descriptorspec = array(
          1 => array(
              'pipe', 'w'
          )
      );
      $process = proc_open($command, $descriptorspec, $pipes);
      if (!is_resource($process)) {
          exit("failed to create process");
      }
      $content = stream_get_contents($pipes[1]);
      fclose($pipes[1]);
      if (proc_close($process) === 0) {
          print_r($content);
      }else{
          exit("failed to execute Hello");
      }
      

      【讨论】:

      • 浏览器输出"failed to execute Hello",但我确实在cmd中正确执行了java Hello
      • proc_close($process) 打印什么?
      猜你喜欢
      • 1970-01-01
      • 2015-10-25
      • 2015-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-18
      • 1970-01-01
      • 2013-08-14
      相关资源
      最近更新 更多