HOME 回資訊服務處首頁 Login
2008年第18期
簡訊
請同仁留意近日釣魚郵件
「院友系統」開發完成
進行98年度本院SAS統計軟體使用需求調查
請把握免費參與「PNC 2008年會暨聯合年會」的機會
參與「第27屆測量及空間資訊研討會」並展出相關成果
歡迎參加「Discovery Studio 2.1」課程
「網路影音服務」新增1場活動內容
資訊技術
淺談PHP與Java之Web開發整合技術
資訊服務
計算中心圖書業務服務簡介(上)
 
資訊技術 >
上一篇 | 下一篇 | 返回電子報
 
淺談PHP與Java之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開發整合技術
  
 目前已知的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所示:
  
List-1 HelloService.java

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

一、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/<nameofservice>。因此,HelloService服務的端點位址為http://localhost:<port>/axis2/services/HelloService。ServiceClass參數指定服務對應的類別。每個<operation>元素定義服務中一個操作的配置。<operation>的name屬性應設置為服務對應類別中方法的名稱。messageReceiver元素定義用於處理此操作的消息接收器。

List-2 services.xml

(2) 將服務包裝成Axis Archive

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

List-3 HelloService.aar的內部結構

(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


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

二、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

(五) 使用瀏覽器連接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會有相容性的問題。

三、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

(五) 使用瀏覽器連接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




上一篇 | 下一篇 | 返回電子報
 
 本電子報所有文字、圖片版權為中央研究院所有 。 電子報出版系統由中央研究院資訊服務處開發。