【问题标题】:PHP JavaBridge permission errorPHP JavaBridge 权限错误
【发布时间】:2012-01-04 00:41:49
【问题描述】:

我有一个现有的大型(ish)PHP Web 应用程序(使用 Apache 和 MySQL),现在需要能够调用基于 Java 的报告引擎。所以,我想要实现的是从现有 PHP 应用程序中访问 java 类的能力。

到目前为止,在一个新的开发服务器上,我已经成功安装了开源 PHP-Javabridge 项目(http://php-java-bridge.sourceforge.net/pjb/index.php)并让它在 Tomcat 下运行(7.0.22) 在使用端口 8080 的 Fedora 15 机器上。由于实时系统的托管限制,我无法使用 Zend Javabridge,不幸的是,目前无法选择更改提供程序。

我还使用端口 80 在开发盒上运行 Apache 和 PHP。

我可以在 Tomcat 中访问 JavaBridge webapp,并且所有 PHP 示例都可以正常工作。但是,当我尝试从现有应用程序中访问 JavaBridge 时遇到了问题。

我假设我应该可以从位于 Apache (/var/www/html) 的 Web 根目录中的脚本中调用 php 'java' 函数。

我使用 JavaBridge 应用程序中提供的脚本如下:

<?php
    require("http://127.0.0.1:8080/JavaBridge/java/Java.inc");
    echo java("java.lang.System")->getProperties();
?>

这会在 /etc/httpd/logs/error_log 中产生以下错误

[2011 年 11 月 22 日星期二 15:01:08] [错误] [客户端 ::1] PHP 警告:require_once(http://localhost:8080/JavaBridge/java/Java.inc):无法打开流:第 2 行 /var/www/html/javatest.php 中的权限被拒绝

[2011 年 11 月 22 日星期二 15:01:08] [错误] [客户端 ::1] PHP 致命错误:require_once(): 无法打开所需的 'http://localhost:8080/JavaBridge/java/Java.inc ' (include_path='.:/php/includes:/usr/share/apache-tomcat-7.0.22/webapps/JavaBridge') 在 /var/www/html/javatest.php 第 2 行

另一个建议的脚本是:(注意:我在 /var/www/html 中有 Java.inc 的副本)

<?php
    define("JAVA_HOSTS", "127.0.0.1:8080");
    define("JAVA_SERVLET", "/JavaBridge/servlet.phpjavabridge");
    require_once("./Java.inc");
    echo java("java.lang.System")->getProperties();
?>

这会产生以下错误:

[2011 年 11 月 22 日星期二 12:57:51] [错误] [客户端 ::1] PHP 警告:fsockopen():无法连接到 /usr/share/apache 中的 127.0.0.1:8080(权限被拒绝) -tomcat-7.0.22/webapps/JavaBridge/java/Java.inc 在第 994 行

[2011 年 11 月 22 日星期二 12:57:51] [错误] [客户端 ::1] PHP 致命错误:未捕获 无法连接到 JEE 服务器 127.0.0.1:8080。请启动它。错误消息:Permission denied (13)\n\n throw in /usr/share/apache-tomcat-7.0.22/webapps/JavaBridge/java/Java.inc on line 989

我为排除问题所采取的步骤是:

  • 关闭服务器上的防火墙
  • 将所有内容修改为 777
  • 在我运行 PHP 脚本之前和之后检查 Tomcat 是否正在运行(我可能错误地认为 Tomcat 是第二条错误消息中提到的 JEE 服务器?) 4)。 PHP ini 文件没有 open_basedir 限制,安全模式未开启以及 allow_furl_open 和 allow_url_include 选项

我真的坚持这一点。没有多少谷歌搜索发现任何类似的具体问题。

我必须说我对 Java 非常不熟悉,并且可能在 JavaBridge 上搞错了,因为它可能根本无法从 /var/www/html 位置运行 java 函数,而且任何PHP 脚本必须在 Tomcat JavaBridge 应用程序中运行。

我假设所有 servlet 都在工作,但我缺乏知识意味着我不知道如何检查。

由于这是在 Fedora 上,它是否与 SELinux 权限问题有关?

【问题讨论】:

    标签: php php-java-bridge


    【解决方案1】:

    Narcissus - 非常感谢您的意见,但事实证明这是 SELinux 的权限问题,导致 PHP 无法调用 JavaBridge。

    我已通过以 root 用户身份发出以下命令来关闭 SELinux,暂时解决了这个问题:

    setenforce 0
    

    我需要找到一个更令人满意的长期解决方案来改变 SELinux 权限以允许 PHP 和 Javabridge 之间的交互,但这是一个不同的问题......

    【讨论】:

      【解决方案2】:

      您是否在 php.ini 中添加了此代码?

      allow_url_include = On
      

      【讨论】:

        【解决方案3】:

        我在设置 PHP Java Bridge 时也遇到了一些问题。不过,查看我的设置,我发现我将 JAVA_HOSTS 定义为 127.0.0.1:8087。

        如果您的浏览器能够在该端口上看到某些内容,但桥接仍然无法正常工作,则可能是侦听应用程序未正确侦听。

        如果您转到 php-java-bridge.sourceforge.net/pjb/desktop-apps.php 并按照“将 PHP/Java Bridge 库添加到您的 Java 应用程序”中的粗体代码部分,您可以看到你需要:

        • 将 JavaBridge.jar 文件添加到您的项目中
        • public static final String JAVABRIDGE_PORT="8087"; 添加到您的班级
        • static final php.java.bridge.JavaBridgeRunner runner = php.java.bridge.JavaBridgeRunner.getInstance(JAVABRIDGE_PORT); 添加到您的班级
        • 在你的主函数中,调用runner.waitFor();

        这基本上会让你的应用程序开始监听。

        【讨论】:

        • 感谢您的快速回复!但恐怕没有乐趣 - 仍然得到许可被拒绝错误。它显然找到了 Java.inc 文件,但似乎有东西阻止它运行 JavaBridge...
        • 所以当您将浏览器发送到该 IP 地址/端口号时,您会得到什么吗?如果我没有在另一端运行我的 Java 应用程序(调用 'runner.waitFor();' 的应用程序,其中 runner 是 php.java.bridge.JavaBridgeRunner 的一个实例),我会超时。但是,如果应用程序正在运行,我似乎会得到一个目录列表。对不起,如果你已经回答了!
        • 是的 - 这就是为什么它有点奇怪。我可以通过 127.0.0.1:8080/JavaBridge...访问 JavaBridge(以及所有示例)...
        • 如果您可以让示例与“示例”项目一起运行,我会检查您的 Java 应用程序是否正确运行 JavaBridgeRunner...您可以检查它是否正在侦听端口 8080?
        • 啊!这就是我缺乏Java的地方!我想我假设 Tomcat 正在处理 8080 上的所有监听并运行所有必要的 servlet(这就是 JavaBrisgeRunner 吗?)。我不知道如何检查 JavaBridgeRunner 是否正在运行,如果是,它正在侦听哪些端口。感谢您一直以来的帮助...
        【解决方案4】:

        为了给其他人一个偶然发现的额外故障排除选项——这对我有用:

        sudo setsebool -P httpd_can_network_connect_db=1
        

        这使 SELinux 允许 apache 连接到您的数据库。我收到这样的错误:

        httpd错误日志:

        java.sql.SQLNonTransientConnectionException: .... 权限被拒绝。 原因:java.net.SocketException: Permission denied

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-11
          • 1970-01-01
          • 2018-08-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多