PHP JavaBridge权限错误

时间:2011-11-22 16:21:40

标签: php php-java-bridge

我有一个现有的大型(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时,我遇到了一个问题。

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

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

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

这会在/ etc / httpd / logs / error_log

中产生以下错误
  

[Tue Nov 22 15:01:08 2011] [error] [client :: 1] PHP警告:require_once(http:// localhost:8080 / JavaBridge / java / Java.inc):无法打开流:第2行/var/www/html/javatest.php中的权限被拒绝

     

[Tue Nov 22 15:01:08 2011] [错误] [client :: 1] PHP致命错误:require_once():无法打开所需&#39; http:// localhost:8080 / JavaBridge / java / Java.inc&#39;第2行的/var/www/html/javatest.php中的(include_path =&#39;。:/ php / includes:/usr/share/apache-tomcat-7.0.22/webapps/JavaBridge')

另一个建议的脚本是:(注意:我在/ 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] [错误] [client :: 1] PHP警告:fsockopen():无法连接到/ usr / share / apache中的127.0.0.1:8080(权限被拒绝)第994行-tomcat-7.0.22 / webapps / JavaBridge / java / Java.inc

     

[Tue Nov 22 12:57:51 2011] [error] [client :: 1] PHP致命错误:Uncaught无法连接到JEE服务器127.0.0.1:8080。请开始吧。错误消息:在989行的/usr/share/apache-tomcat-7.0.22/webapps/JavaBridge/java/Java.inc中抛出权限被拒绝(13)\ n \ n

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

  • 关闭服务器上的防火墙
  • Chmod将一切都改为777
  • 检查Tomcat是否在运行PHP脚本之前和之后运行(我假设,可能是错误的,Tomcat是第二条错误消息中引用的JEE服务器?) 4)。 PHP ini文件没有open_basedir限制,安全模式没有打开,allow_furl_open和allow_url_include选项

我真的坚持这个。没有任何数量的谷歌搜索发现任何类似的具体问题。

我必须说我对Java非常不熟悉,并且可能在JavaBridge上遇到了错误的结果,因为它可能无法在/var/www/html内运行java函数。位置以及必须在Tomcat JavaBridge应用程序中运行任何PHP脚本。

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

因为这是在Fedora上它是否可以连接到SELinux权限问题?

4 个答案:

答案 0 :(得分:3)

Narcissus - 非常感谢你的输入,但结果却是SELinux的权限问题阻止了PHP调用JavaBridge。

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

setenforce 0

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

答案 1 :(得分:2)

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

allow_url_include = On

答案 2 :(得分:0)

在设置时,我也遇到了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();

这基本上会使你的应用程序听起来。

答案 3 :(得分:0)

为了给别人一个额外的麻烦拍摄选项,偶然发现 - 这对我有用:

sudo setsebool -P httpd_can_network_connect_db=1

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

httpd错误日志:

  

java.sql.SQLNonTransientConnectionException:....权限被拒绝。   引起:java.net.SocketException:Permission denied