2011-11-22 57 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