新寵混血兒誕生記--Java+PHP整合

      這幾天,一直在研究一個新的開發模式,因此把他帖出來,供你們分享一下。使用開源的LAJP技術。php

  目的:java

         驗證兩種各自領域稱王的語言(JAVA /PHP),不一樣語言、不一樣機制的組合在一塊兒,PHP負責WEB層,Java負責業務和數據邏輯層,真是一對黃金組合(Java+PHP整合=混血新寵兒),發揮各自優點,適合開發B/S企業程序。程序員

1 技術問題web

兩種不一樣環境,不一樣機制的語言結合,首先要解決的是如何通信?其次是通信內容如何處理?最後是二者開發,部署環境整合?
Php:直觀,快速,簡單,易學,開發動態網頁效率高,草根文化氣息濃重,是語言世界的平民英雄,注重於結果。
Java:強大而複雜,有衆多高端功能,又有IMB、Oracle等企業大顎的追捧,是語言世界的貴族王子。
從操做系統層面觀察: PHP和Java是系統中運行的不一樣進程,他們之間溝通屬於進程間通訊技術(IPC):
       

在傳統的Unix環境中,IPC技術有:管道、消息隊列、共享內存、信號量等,但在同一個系統中,IPC通訊比基於TCP的socket通訊在性能、資源佔用方面有至關大的優點。
在Unix/Linux中,PHP基本提供了全部IPC的訪問接口,由於PHP能夠看做是以C語言爲核心的一個殼,而IPC是系統內核的組成部分,對外提供了一組C函數接口,所以PHP能夠很是順暢的運用IPC技術。而Java爲了追求誇平臺性(Windows的IPC技術和Unix的不一樣),沒有提供系統級的IPC訪問,這也體現了Java的文化特點:爲追求統一可犧牲效能。
消息隊列技術只能適用於Unix/Linux系統,而SOCKET基於TCP/IP的通信機制,從而適應各類平臺。
 

從上圖中看出,PHP承擔HTTP層的職責,而Java承擔業務層的職責,他們經過System V Message Queue(消息隊列,進程間通信IPC中的一種)相互溝通,Java須要JNI的支持。
使用消息隊列有如下好處:

1.       使php和java保持獨立性
2.       有極高的傳輸速度,大於socket
3.       相對於socket方式,Java服務端只向本機提供服務(沒有對外偵聽端口),相對安全,易於管理。

通訊問題解決了,通訊內容如何解決呢?
PHP和Java各自語言內部定義的數據類型,當兩種語言互相傳輸數據時,數據類型怎樣進行轉換呢? 
* Xml: xml確是一種誇平臺、可以很好描述對象模型的數據封裝技術,但xml體積大傳輸速率慢,通信兩端解析也比較麻煩。
* 序列化: 在傳輸過程當中使用序列化和反序列化對象來傳輸數據是一種公認且比較合理的方式,且兩種語言都支持。
 
2   Java與php 結合選型
目前已知的PHP與Java在Web間整合技術可分紅SOAP(Simple Object Access Protocol)、Quercus、PHP/Java Bridge三種,這些技術可讓PHP與Java在開發Web應用程序時互相使用彼此的程序庫。

SOAP
SOAP是IBM、Microsoft等公司開發、W3C推薦,用來實現分佈式對象技術的協議。SOAP提供了一套以XML來包裝程序調用、參數傳遞與信息回傳的機制,藉助XML純文字的特性,可經過HTTP、HTTPS、SMTP等通訊管道穿越企業的防火牆。比起CORBA、Java RMI及DCOM這些以專屬binary格式傳送數據的分佈式對象技術協議,SOAP具備與程序語言、平臺和硬件無關的特性。
Quercus
Quercus是一個開源 PHP 5 引擎,它已經擁有了純 Java 的完整實現。Quercus 在 Resin 應用服務器之上運行,利用了負載平衡、代理緩存等 Resin 特性。
PHP/Java Bridge
開源產品有:Php-java-bridge 與 LAJP

ü 免費、開源
ü 簡單易用
ü 高效穩定
Ø  優點互補: PHP是很是流行的WEB編程腳本語言,有易學、易用、開發部署效率高的特色,          很是適合網頁編程;JAVA適合編寫具備複雜的業務功能和數據的程序,兩者結合可發揮各自優點。
Ø  高效穩定:Apache+PHP組合可帶來優異的WEB服務穩定性,而JAVA可補充如鏈接池、事物管理、分佈式、對象模型等高端特性。
Ø  創新的通訊機制: PHP和Java間的通信方式採用系統消息隊列和Socket兩種機制,兼顧通信效率和平臺兼容性。
Ø  數據類型自動轉換機制: PHP數據和Java數據可準確地自動匹配和轉換,無須程序員編寫解析代碼。
Ø  易用:LAJP安裝配置簡單,PHP端和JAVA端編程符合各自的編程習慣。
Ø  輕量級:LAJP架構很是輕量級,除了最基本的PHP和Java環境,不須要任何擴充的、第三方的組件、容器。
2.2.2      數據類型轉換
PHP和Java各有其語言內部定義的數據類型,當PHP數據傳送到Java,或Java數據傳送到PHP時,LAJP在內部自動地、準確地對他們進行轉換,程序員無需進行任何的解碼工做。
 

2.2.3    LALP 運行環境
消息隊列模式
環境須要知足System V消息隊列的運行:
  • 系統 目前常見的Unix/Linux系統均可知足php(Apache)、java的運行,其中大部分默認支持System V消息隊列。
  • php php須要經過消息隊列和java進程通訊,按php的說明,php在4.3.0版本之後支持System V消息隊列。
  • apache 無特殊要求,知足php要求便可。
  • java java版本在1.5之後。
  • 在Unix/Linux環境中,推薦使用消息隊列模式。
socket 模式
  • 系統 沒有限制,很難找到不支持TCP/IP的系統。
  • php 按php的說明,php版本>=4.1.0支持socket
  • apache 無特殊要求,知足php要求便可。
  • java java版本在1.5之後。
  • Windows系統只能使用socket模式
在開發過程當中能夠同時使用這兩種模式,好比通常開發者使用 Windows 環境,而程序部署在 Linux 系統中, LAJP 在模式的配置上和編碼無關。
2.2.4.1         分佈式架構
在重要的、關鍵性的業務場景中,用戶交互層和業務層是分開部署的,LAJP在此類架構中能夠這樣使用:
 
WEB服務器中的Java是很是「薄」的一層,僅用來鏈接後面的EJB服務。
2.2.4.2         集羣
隨着用戶訪問量的增長,WEB服務每每成爲系統中的瓶頸,下面是LAJP在集羣中的架構參考:
 

2.2.4.3         web集羣
經過使用socket通信模式的LAJP,能夠搭建出簡單的分佈式的WEB集羣架構:
 

2.2.4.4         複雜架構應用
LAJP使用的靈活性,架構的設計和選擇更多在於咱們本身的思想,下面的架構參考在WEB層、EJB層都使用了集羣:
 

memcache是分佈式的內存對象緩存技術,在PHP中能夠很是方便的將Session數據存儲在其中,來同步WEB集羣中各節點中的數據,從這裏也能夠體現到PHP在WEB領域相對於Java的「專業」。
相關文章
相關標籤/搜索