2009-05-21 95 views
7

我正在實現一個使用PHP作爲前端和Java服務作爲後端的網站。這兩部分如下:將PHP代碼連接到Java後端

  1. PHP前端監聽http請求並與數據庫交互。

  2. Java後端連續運行並響應來自前端的調用。

更具體地說,後端是一個連接並保持連接到幾個IM服務守護進程(AOL,MSN,雅虎,Jabber的...)。

這兩個層都將部署在同一個系統(CentOS盒,我想)和引入中間層(例如:使用XML-RPC)會降低性能(資源也相當有限)。

問:有沒有辦法直接鏈接兩個圖層? (沒有更多的網絡服務之間)

回答

1

你可以試試PHP/Java integration。另外,如果通信是單向的(類似於「用於IM的sendmail」),則可以將PHP請求寫出到文件中並在Java應用程序中監視它。

+0

溝通實際上是雙向的。但是,即使是單向的,我們仍然需要處理文件鎖定。它可以通過使用命名管道來解決,但仍然被視爲中間層。 – ThoaiOnline 2009-05-21 08:52:53

+0

從簡介:「警告:此擴展是實驗性的,此擴展的行爲,包括其功能名稱和任何其他圍繞此擴展的文檔可能會在未來的PHP版本中發生更改,恕不另行通知。風險。」 – 2009-05-21 08:53:22

+0

這幾年來一直在進行實驗 - 我讀爲「廢棄」。無論如何這是一箇中間層 - 我不確定實際上是否可以直接創建Java和PHP接口,而不需要a)使用中間層或b)編寫自己的接口。 – Piskvor 2009-05-21 14:13:05

9

由於這是兩個獨立運行的進程之間的通信,因此「直接」呼叫(如JNI)是不可能的。執行此類進程間通信的最簡單方法可能是named pipes和網絡套接字。在這兩種情況下,你都必須定義一個通信協議並在雙方實現它。使用諸如XML-RPC之類的標準協議使得這更容易,但並非絕對必要。

-1

我遇到了這個頁面,它介紹了鏈接兩層的方法。但是,它仍然需要中間層(TCP/IP)。而且,其他服務也可能會利用Java服務,因爲它接受所有傳入的連接。

http://www.devx.com/Java/Article/20509

[研究...]

+1

你應該編輯你的問題,而不是回答它。正如我寫的,如果沒有某種中間層,兩個獨立的進程不可能進行通信。至於從外部訪問,這就是防火牆的用途,但命名管道不會出現這個問題。 – 2009-05-21 09:09:31

3

我已經試過PHP-Java橋接(php-java-bridge.sourceforge.net/pjb/),它工作得很好。基本上,我們需要運行一個jar文件(JavaBridge.jar),它監聽端口(有幾個選項可用,如本地套接字,8080端口等)。您的java類文件必須可以在類路徑中的JavaBridge中使用。你需要在你的php中包含一個Java.inc文件,你可以訪問Java類。

2

當然,也有很多方法,但你說對有限的資源......

恕我直言定義的TCP/IP自己的輕量級類RPC協議和使用插座進行通信。實際上,在這種情況下,不需要使用RPC等的全部優點...您只需要爲這種特定情況定義API並在兩側實施它。在這種情況下,您可以將數據包序列化得相當小。您甚至可以爲您的遠程方法分配一種GUID,並使用它們來節省流量並加速您的交互。

套接字使用的優點是您的解決方案具有很好的可擴展性。

4

通常有應用程序集成的四種模式:

    通過文件系統
  1. ,即。一個生產者通過數據庫將數據寫入由消費者監控的目錄
  2. ,即,兩個應用程序共享一個架構或表,並通過RMI/RPC/web服務/任何阻塞來將數據交換
  3. ,同步從一個應用程序到另一個應用程序。對於PHP到Java,您可以從上面列出的各種集成庫中選擇,或使用一些Web服務標準(如SOAP)。
  4. 通過消息/任何非阻塞異步操作,其中一個應用程序將消息發送到另一個應用程序。

這些模式都有優點和缺點,但一個好的經驗法則是選擇一個最鬆散的耦合,你可以擺脫。例如,如果您選擇#4,那麼您的Java應用程序可能會崩潰而不會取消您的PHP應用程序。

在查看答案中列出的特定庫或技術之前,我建議您爲您選擇正確的模式,然後調查您的具體選項。

0

對不起,這是一個快速回答,但:我聽說Resin應用程序服務器支持集成Java和PHP。

他們聲稱能粉碎PHP和Java一起:http://www.caucho.com/resin-3.0/quercus/

我用樹脂供應J2EE應用程序,而不是它的PHP支持。

我很想聽聽這樣的冒險。

0

爲什麼不使用網絡服務?

製作一個Java層並放置一個ws訪問權限(Axis,SpringWS等等),Php使用一個ws客戶端訪問Java層。

我覺得這很簡單有用。

1

我最近也遇到過這個問題。上面的Resin解決方案實際上是一種完全按照JRuby,Jython和Rhino的語言重新編寫的PHP Java語言。它被稱爲櫟。但我爲你猜測,因爲它是爲我而設,拋出你的Apache/PHP設置不是一個真正的選擇。

此外還有更多的Quercus問題:免費版本是GPL,如果您正在開發商業軟件(儘管不像Resin想要您相信(但IANAL)那麼棘手),並且在免費版本不支持編譯爲字節碼,所以它基本上是一個用Java編寫的解釋器。

我最終決定的只是通過HTTP交換簡單的消息。我使用PHP的json_encode()/json_decode()和Java的json-lib以JSON編碼消息(簡單,基於文本,與數據模型匹配良好)。

另一個有趣且輕量級的選擇是讓Java生成PHP代碼,然後使用PHP include()指令通過HTTP獲取並執行它。我還沒有嘗試過。

如果您真正關注的HTTP調用(性能),這些解決方案都不會對此有所幫助。我只能說,我在同一個LAN上沒有遇到PHP和Java的問題。我的感覺是,對於絕大多數應用程序來說這不會成爲問題,只要你保持RPC調用的過程相當粗糙(無論如何你都應該這樣做)。