借《淺談PHP與Java之Web開發整合技術》說LAJP

這是早先在網上流傳的一篇PHP與Java相結合的技術文章,其中列舉了三種整合技術:SOAP、 Quercus、PHP/Java Bridge,這對理解並使用LAJP框架有很好的參考做用,所以將原文摘錄在此,並在後面做出我我的的評價。php


========================================html

《淺談PHP與Java之Web開發整合技術》java

做者:鄭哲聖 摘錄來源:http://newsletter.ascc.sinica.edu.tw/news/read_news.php?nid=1483程序員

前言web

PHP為語法簡單的腳本語言,能夠作為HTML的嵌入型語言,並且與Apache網頁伺服器搭配的設定容易、效能亦高。Java則是商業用途的優秀 物件導向語言,具備很是多有用的程式庫,也有許多Web應用程式開發框架(framework)。比較PHP與Java,PHP的商業用途程式庫較為缺 乏,而Java的語法、開發環境設定較為複雜。所以,Web開發人員不應對 PHP或Java抱持成見,而應審時度勢,結合PHP與Java各自的優勢,才能更有效率地開發Web應用程式。本文將介紹三種不一樣的PHP與Java整 合開發技術,但願能夠提供建置PHP與Java之Web開發整合環境的參考。

三種PHP與Java之Web開發整合技術apache

目前已知的PHP與Java之Web開發整合技術可分紅SOAP(Simple Object Access Protocol)、Quercus、PHP/Java Bridge三種,這些技術能夠讓PHP與Java在開發Web應用程式時互相使用彼此的程式庫。本文因篇幅關係,將側重於介紹如何在PHP程式中使用 Java程式庫以及如何配置SOAP、Querus與PHP/Java Bridge等套件。編程

本文使用的Java程式庫範例如List-1所示:windows

List-1 HelloService.java網絡

1289

下面將介紹如何讓PHP結合SOAP、Querus與PHP/Java Bridge技術,呼叫echoHello(」Jason」),並獲得」Java say hello to Jason」的執行結果。多線程

1、SOAP(Simple Object Access Protocol)

SOAP是IBM及 Microsoft等公司開發、W3C推薦,用來實做分散式物件技術的協定。SOAP提供一套以XML來包裝程式呼叫、參數傳遞與訊息回傳的機制,藉由 XML純文字的特性,可透過HTTP、HTTPS、SMTP等通訊管道穿越企業的防火牆,比起CORBA、Java RMI及DCOM這些以專屬binary格式傳送資料的分散式物件技術協定,SOAP具備與程式語言、平臺和硬體無關的特性。

Java語言最常使用的SOAP套件是Apache Axis2,PHP的是php-soap延伸模組。下面說明如何透過這兩個SOAP套件整合PHP與Java。

(一) 前置做業:安裝PHP >=5.0版、JDK >=1.4版以及Tomcat。

(二) 使用Apache Axis2將List-1 HelloService.java程式庫部署成SOAP的Web Services

1. 安裝Apache Axis2

首先到Apache Axis2網站首頁下載最新的WAR(Web Archive)Distribution-axis2.war。將Tomcat的伺服器配置中的unpackWARs設為True,然後將 axis2.war複製到Tomcat的webapps目錄下。從新啟動Tomcat,若是訪問http://localhost:port/axis2 能夠看到Axis2歡迎頁,即完成Apache Axis2的安裝。其中port是Tomcat的網路服務埠口,通常為8080。

2. 部署HelloService服務

(1) 撰寫services.xml來描述服務部署訊息

HelloService.java的服務部署訊息如List-2所示。服務的name屬性定義服務的名稱。Apache Axis2使用服務的名稱創建服務的端點位址,如http://localhost:port/axis2/services/。 所以,HelloService服務的端點位址為http://localhost:port/axis2/services /HelloService。 ServiceClass參數指定服務對應的類別。每個元素定義服務中一個操做的配置。的 name屬性應設置為服務對應類別中方法的名稱。messageReceiver元素定義用於處理此操做的消息接收器。

List-2 services.xml

1290

(2) 將服務包裝成Axis Archive

Apache Axis2服務必須先包裝成Axis Archive (.aar)才能部署。Axis Archive (.aar)的格式與jar文件相同(使用jar或zip創建),內部包含服務對應的類別與services.xml。HelloService服務的 aar文件內部結構如List-3所示:

List-3 HelloService.aar的內部結構

1291

(3) 完成服務部署

在Apache Axis2中部署服務相當簡單,只需將 .aar複製到Tomcat目錄下的/webapps/axis2/WEB-INF/services/便可完成部署。

(三) 使用php-soap延伸模組讓PHP調用HelloService服務

1. 載入、設定php-soap延伸模組

(1) 載入php-soap延伸模組

在php.ini找到延伸模組設置部分,增長一行代碼來自動載入php-soap延伸模組。在Windows上,這一行代碼是: 「extension = php_soap.dll」;在UNIX上是:「extension = php_soap.so」。定義、設定extension_dir,讓它指向包含php-soap延伸模組的目錄。若是須要從新編譯原始程式碼,請在 configure命令中添加–enable-soap選項,再從新編譯。

(2) 設定php-soap延伸模組

在php.ini增長下列代碼,以完成php-soap延伸模組的設定:

[soap]
soap.wsdl_cache_enabled=0
soap.wsdl_cache_dir=」/tmp」
soap.wsdl_cache_ttl=86400

2. 撰寫PHP的SOAP client

程式如List-4所示,sayHello1.php首先會讀取HelloService服務的WSDL文件(由Apache Axis2根據services.xml產生)來創建SOAP client,再設定參數param0為Jason,然後呼叫HelloService服務的echoHello函式,最後獲得並列印出回傳的結 果:」Java say hello to Jason」,詳細的運做過程如【圖1】所示。

List-4 sayHello1.php

1292

利用SOAP整合PHP與Java之運做示意圖

【圖1】利用SOAP整合PHP與Java之運做示意圖

2、Quercus

Quercus是Caucho Technology公司為resin application server開發之100%以Java實做的PHP 5引擎(required JDK 1.5)。Quercus能夠讓PHP程式在JVM上執行,下面介紹如何使用Quercus搭配resin來整合PHP與Java。

(一) 前置做業:安裝JDK >=1.5版。

(二) 安裝resin application server及Quercus

首先到Caucho Technology公司的首頁(http://www.caucho.com/)下載resin application server的zip文件(內含Quercus),然後將其解壓縮到某個目錄$RESIN_HOME,例如:windows環境下的c:\resin。啟 動$RESIN_HOME下的httpd.exe,使用瀏覽器連接http://localhost:8080/,若是能夠看到成功執行的畫面,表明 resin application server及Quercus已成功安裝。

(三) 將List-1 HelloService.java放在$RESIN_HOME/webapps/ROOT/WEB-INF/classes/hello/目錄下。 HelloService.java在被調用時,會自動被編譯成class文件。

(四) 撰寫PHP調用HelloService.java的程式,如List-5所示。將sayHello2.php放 在$RESIN_HOME/webapps/ROOT/ 目錄下。

List-5 sayHello2.php

1293

(五) 使用瀏覽器連接http://localhost:8080/sayHello2.php,resin application server就會把$RESIN_HOME/webapps/ROOT/sayHello2.php送給Quercus轉換成相對應的java程式,然後 編譯、執行,最後resin application server回傳」Java say hello to Jason」,顯示在瀏覽器畫面。

使用Quercus搭配resin整合PHP與Java只須要安裝JDK、resin application server(內含Quercus),若要連接資料庫才需再安裝其餘資料庫伺服器,如:MySQL Server,環境的設置比起SOAP與PHP/Java Bridge整合方式來得簡單。但Quercus與PHP/Zend Engine會有相容性的問題。

3、PHP/Java Bridge

Java和script語言的介面定義於JSR 223,JSR是Java Specification Requests的簡寫。JSR 223規定了從script語言創建Java類別實體、呼叫方法以及取得結果物件的介面,也規定了從Java呼叫script語言的方法、轉換參數以及傳 回值的方法。下面介紹如何使用PHP/Java Bridge套件讓PHP使用Java程式庫,PHP/Java Bridge是JSR 223之PHP 5的Java介面實做。

(一) 前置做業:安裝PHP >=5.0版、JDK >=1.4.2版、Apache HTTP Server >=2.0版、Tomcat(使用port 8080)。

(二) 安裝PHP/Java Bridge套件

1. 首先到PHP/Java Bridge網站的首頁(http://php-java-bridge.sourceforge.net/doc/),點選「download」能夠連 到SourceForge.net,選擇下載php-java-bridge_j2ee.zip文件,解壓縮後,能夠取得 JavaBridge.war文件。將Tomcat的伺服器配置中的unpackWARs設為True,然後將JavaBridge.war複製到 Tomcat的webapps目錄下。從新啟動 Tomcat,便可在webapps目錄下看到JavaBridge這個目錄。

2. 將JavaBridge目錄下的java子目錄完整複製到$PHP_INCLUDE目錄,並將$PHP_INCLUDE目錄加到 php.ini的include_path。例如:若$PHP_INCLUDE是c:\php5\pear,則include_path=」.;c: \php5\pear」。java子目錄內包含使用PHP實做的PHP/Java Bridge原始程式碼。

(三) 將List-1的程式放在Tomcat目錄下的webapps/JavaBridge/WEB-INF/classes/hello/ 中,並編譯之。

(四) 撰寫PHP調用HelloService.java的程式,如List-6所示。將sayHello3.php放在Apache Server的DocumentRoot目錄下。

List-6 sayHello3.php

1294

(五) 使用瀏覽器連接http://localhost/sayHello3.php,則Apache Server會將sayHello3.php交給PHP/Zend Engine編譯、執行。當PHP呼叫Java程式庫時,PHP/Java Bridge (java子目錄下的php程式)會將此呼叫轉換成 *.phpjavabridge文件格式,然後傳送到Tomcat下JavaBridge的 php.java.servlet.PhpJavaServlet處理,最後透過PHP/Java Bridge回傳結果給PHP。List-6程式執行後可看到」Java say hello to Jason」顯示在瀏覽器畫面。

結語

隨著Web的發展,使用單一語言來開發Web應用程式未必是最有效率的方式。期許透過本文的介紹,能夠讓Web開發人員瞭解如何使用PHP與 Java兩種語言整合開發Web程式的技巧,更但願能夠促使Web開發人員思考、發掘更好的Web 應用程式開發方式,以因應電子化時代快速變動及大量產生的資訊需求。

參考資料

【1 】SOAP – Wikipedia, the free encyclopedia. Available at URL
http://en.wikipedia.org/wiki/SOAP

【2 】Apache Axis2. Available at URL http://ws.apache.org/axis2/

【3 】Quercus: PHP in Java. Available at URL
http://www.caucho.com/resin-3.0/quercus/

【4 】PHP/Java Bridge. Available at URL http://php-java-bridge.sourceforge.net/doc/

【5 】JSR 223: Scripting for the JavaTM Platform. Available at URL
http://jcp.org/en/jsr/detail?id=223

[原文完]

========================================

評:

文中列舉了三種整合技術:SOAP、Quercus、PHP/Java Bridge,這裏來一一分析其特色。

【SOAP 】

SOAP是WebService中的對象傳輸協議,是當前咱們首先會想到的跨語言、跨平臺的傳輸技術,在過去則是CORBA。CORBA是已經飄過 去的雲,無需多說,這裏主要說說SOAP的特色:

主要優勢:輕量級相對簡單,HTTP協議穿透能力強,當前很是流行。
主要缺點是慢。

這幾年咱們在爲電信開發項目,系統與系統間傳輸主要使用了三種技術:Tuxedo、EJB、WebService,從傳輸效率上比較,最快的是 Tuxedo,最慢的是WebService(SOAP)。Tuxedo在計費等及其要求運行速度的系統中有其餘技術不能替代的優點,但Tuxedo編程 使用C語言,運用面不廣;電信系統總體以J2EE爲主,核心的數據傳輸使用EJB,而EJB的主要問題是系統間依賴性太強,在電信以大大小小數十個系統組 成的大系統中,解耦尤爲重要。實踐中EJB常常形成的問題是當其中一個系統升級,會形成和周邊系統版本不一致。後來外圍系統多用WebService目的 就是減小系統間的耦合性,但帶來的另外一個問題是傳輸效率慢了不少,主要緣由有兩點:數據用XML封裝體積大,DOM解析內存佔用多。

回過頭來看LAJP,傳輸效率上應比Tuxedo還要好,由於Tuxedo再快也是基於網絡的,而LAJP是基於消息隊列,固然這只是理論對比、紙 上談兵,具體影響效能的因素不少,我之前寫過一篇文章《Linux下消息隊列和socket絕對速度 比拼》,對研究消息隊列的性能有一點參考。

從簡單性上看,LAJP比WebService簡單,Axis配置有必定的複雜性,且WSDL、SOAP等概念性太強,初學者難以領會。

【Quercus 】

Quercus是走錯了方向的技術,這是Java「通吃天下」思想的產物,沒了Apache的幫襯,沒了原生函數庫的支持,PHP還剩下什麼?沒毛 的鳳凰連原始的asp都不如。

【PHP/Java Bridge 】

我對php-java-bridge瞭解不深,初看和個人LAJP有些類似(應該說LAJP和php-java-bridge類似,畢竟是LAJP 出道晚),以我目前的瞭解它欠缺PHP和Java的數據映射,使用起來不方便,另外結構上覆雜了一些。

站在LAJP的立場上,我對原文中三種技術或多或少的給予批評,但文中的觀點卻極爲同意:「Web開發人員不應對 PHP或Java抱持成見,而應審時度勢,結合PHP與Java各自的優勢,才能更有效率地開發Web應用程式」。這是具備大局觀、大境界的觀 點,看似簡單,實則深奧。在建立LAJP這個開源項目時,我預想了可能遇到的阻力:

1. 從結構上看LAJP和JSP+JavaBean是同樣的,既然已有JSP+JavaBean,爲何還要LAJP?
2. 我是Java程序員,LAJP要求學習PHP,不肯意,有困難。
3. LAJP是我的負責的開源軟件,技術上有風險。

1. 不考慮底層實現,從架構上看,LAJP和JSP+JavaBean確實是同樣的,咱們能夠換個角度看這個問題,若是用純JSP和PHP開發Web系統,熟 優?LAJP能夠看做是JSP+JavaBean變換成PHP+Javabean,所謂取之長,補之短,道理就在這裏。

2. Java程序員看不起、不肯學PHP,這是對PHP有成見,一直以來都有PHP、asp程序員水平不高的錯誤觀點。實際上如今流行的開源Web軟 件,PHP質量明顯高於Java,像wordpress,phpBB等軟件,尚未Java開發出能望其項背者。並且PHP至關易學,對一個從事過Web 開發的Java程序員,PHP的學習難度遠小於Struts、Spring,PHP號稱5分鐘上手,資質差的一小時上手,兩星期熟練不會成問題,何況 PHP原生函數會帶給你操做系統、圖像編輯等新的領域的知識,也不會讓你爲一個上傳組件七尋八找一堆jar文件,何樂而不爲?

3. 雖然我本身頗有信心,但未通過長時間、大應用的考驗,LAJP可否做爲一個穩定可靠的架構組件是有疑問的,這裏我講述LAJP中使用的技術,你們能夠從中 分析一下:

先說PHP端,在這裏LAJP沒有要求添加.so,只添加了一個php_java.php文件,在這個文件裏運用了三項技術:PHP序列 化,System V的消息隊列和System V的信號量。序列化是PHP語言的核心,System V在Unix中已存在了超過20年,因此這裏沒有要擔憂的。

LAJP的主要實如今Java端,大部分代碼在作PHP序列化數據的解析和組裝,基本都是枯燥的字符串拼接操做,這裏可能有小bug,但不會有硬 傷;其次,運用了Java的反射機制來查找類、方法,並調用執行方法,這些和Struts、Spring的實現是類似的(JDK中就提供了那幾個反射操 做),也不大會出問題;再有,經過JNI操做System V的信號量、消息隊列,JNI是比較容易出情況的地方,但我認爲也不大可能出現問題,由於實現代碼太過簡單了。

最後,也是我在LAJP上思考最多,至今沒有更好的改進思路的地方在於多線程服務。在LAJP中PHP可看做是客戶端,Java可看做服務端,當 PHP發起一個服務調用時,Java必須應對一個服務線程,這稱之爲併發服務,Tomcat、Websphere的服務也是這樣的。從穩定性上講,併發線 程相對於併發進程要差不少。在設計服務線程時,超時問題是不能迴避的,但在多線程服務中,沒有完美的中止一個服務線程的方法,這不是Java放棄了線程 stop()方法形成的緣由,而是多線程自己的機制。而Java的JVM機制,沒法作成多進程並行機制(太耗內存),這也是Tomcat相比Apache 不穩定的重要因素之一。相對於使用Tomcat、Websphere這些純Java的服務,LAJP理論上要穩定一些,由於最可能出情況的HTTP服務這 一塊交給了Apache,而LAJP中Java服務超時的概率要小不少。

參考資料

【1 】線程相關的資料可閱讀《UNIX環境高級編程》第11章「線程」和第十二章「線程控制」,在這裏不建議閱讀Java的書籍,由於Java線程「丟失」了 太多的細節。

【2 】System V 消息隊列、信號量資料可閱讀《UNIX網絡編程(第二卷)進程間通信》。對於System V不利的小道消息是這項技術老得連最初做者是誰都搞不太清,如今更是沒人來維護,有利的消息是有大量的服務長期在運用着它,例如Oracle。

相關文章
相關標籤/搜索