2011-11-22 73 views
3

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

到目前为止,在新的开发服务器上,我已经成功安装了开源PHP-Javabridge项目(http://php-java-bridge.sourceforge.net/pjb/index.php),并使其运行使用端口8080的Fedora 15盒子上的Tomcat(7.0.22)。由于现场系统的托管限制,我不能使用Zend Javabridge,不幸的是改变的提供者目前不是一种选择。

我也有Apache和PHP的开发机器上运行使用端口80

我可以访问Web应用程序为JavaBridge在Tomcat和所有的PHP的例子很好地工作。但是,当我尝试从现有的应用程序中访问JavaBridge时遇到了问题。

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

我已经使用在JavaBridge的应用程序提供的脚本如下:

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

这产生在/ etc/httpd的/日志/ error_log中

[Tue Nov 22 15:01:08 2011] [error] [client ::1] PHP Warning: require_once(http://localhost:8080/JavaBridge/java/Java.inc): failed to open stream: Permission denied in /var/www/html/javatest.php on line 2

[Tue Nov 22 15:01:08 2011] [error] [client ::1] PHP Fatal error: require_once(): Failed opening required 'http://localhost:8080/JavaBridge/java/Java.inc' (include_path='.:/php/includes:/usr/share/apache-tomcat-7.0.22/webapps/JavaBridge') in /var/www/html/javatest.php on line 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(); 
?> 

这产生了fo llowing错误:

[Tue Nov 22 12:57:51 2011] [error] [client ::1] PHP Warning: fsockopen(): unable to connect to 127.0.0.1:8080 (Permission denied) in /usr/share/apache-tomcat-7.0.22/webapps/JavaBridge/java/Java.inc on line 994

[Tue Nov 22 12:57:51 2011] [error] [client ::1] PHP Fatal error: Uncaught Could not connect to the JEE server 127.0.0.1:8080. Please start it. Error message: Permission denied (13)\n\n thrown in /usr/share/apache-tomcat-7.0.22/webapps/JavaBridge/java/Java.inc on line 989

我已经采取了排除问题的步骤如下:

  • 关机状态防火墙服务器上
  • Chmod'd一切为777
  • 经检查发现是Tomcat在我运行PHP脚本之前和之后运行(我可能错误地认为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的权限问题吗?

回答

3

水仙 - 非常感谢您的输入,但事实证明是SELinux的权限问题,它阻止了PHP向JavaBridge发起调用。

setenforce 0 

我需要找到一个比较满意的长期长期的解决方案来改变SELinux的权限,允许之间的相互作用:

我已经暂时通过发出以下命令,作为根用户关掉SELinux的解决了这个问题PHP和Javabridge,但这是一个不同的问题...

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();

这将基本上将您的应用程序设置为倾听。

+0

感谢您的快速回复!但是我害怕没有喜悦 - 仍然获得许可,否认错误。它明显地找到了Java.inc文件,但似乎阻止它运行JavaBridge ... –

+0

因此,当您将浏览器发送到该IP地址/端口号时,是否有任何东西?如果我没有在另一端运行我的Java应用程序(调用'runner.waitFor();'的应用程序,其中runner是php.java.bridge.JavaBridgeRunner的一个实例),我得到一个超时。如果应用程序正在运行,我似乎得到一个目录列表。对不起,如果你已经回答了! – Narcissus

+0

是的 - 这就是为什么它有点奇怪。我可以通过127.0.0.1:8080/JavaBridge访问JavaBridge(以及所有例子)... –

2

你在php.ini中添加了这段代码吗?

allow_url_include = On 
0

在给其他人碰到这个犯错的额外的故障排除选项的兴趣 - 这为我工作:

sudo setsebool -P httpd_can_network_connect_db=1 

这使SELinux的允许Apache将连接到数据库。我得到象这样的错误:

httpd错误日志:

java.sql.SQLNonTransientConnectionException: .... Permission Denied. Caused by: java.net.SocketException: Permission denied