我有一个现有的大型(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
我采取的排除问题的步骤是:
我真的坚持这个。没有任何数量的谷歌搜索发现任何类似的具体问题。
我必须说我对Java非常不熟悉,并且可能在JavaBridge上遇到了错误的结果,因为它可能无法在/var/www/html
内运行java函数。位置以及必须在Tomcat JavaBridge应用程序中运行任何PHP脚本。
我假设所有servlet都在工作,但我缺乏知识意味着我不知道要检查它。
因为这是在Fedora上它是否可以连接到SELinux权限问题?
答案 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应用程序”中的粗体代码部分进行操作,您可以看到你需要:
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