能夠通過 Web 服務為其他基於 Internet 的 Web 應用程序提供數據和功能正迅速成為重大開發中必不可或缺的組成部分。盡管 Oracle 提供了許多托管 Web 服務的方法,但這麼做始終不是最有效的方法,特別是在已經使用 PHP 來開發 Web 應用程序的情況下。在本手冊中,我將引導您使用 PHP 逐步開發 SOAP 客戶端和服務器,並使用 Oracle 作為數據的後端。
要真正了解這個問題的答案,您需要了解PHP腳本執行的生命周期以及 Web 服務器對該生命周期的影響,本手冊將從此開始逐步展開論述。
必需組件
出於本文的需要,您將使用一個非常簡單的數據庫後端,該數據庫後端將在一個表中存儲有關已發表書籍的某些基本信息,該表由以下 CREATE 語句表示:
CREATE TABLE books(isbn VARCHAR(32) PRIMARY KEY,author VARCHAR(50),title VARCHAR(50),price FLOAT);
該表將充當 SOAP 服務器的數據源,而數據源又會根據需要將數據提供給一個或多個 SOAP 客戶端。盡管在實際應用程序中,您的數據庫可能比較復雜,但這裡描述的方法仍然適用。
建立數據庫(最好在其中放置一些虛擬數據)之後,您現在就可以深入了解用 PHP 開發 SOAP 服務器所涉及的內容了。
SOAP 服務在 PHP 中的工作方式
用 PHP 開發 SOAP 服務的選擇有多種,所有方法都涉及到 SoapServer PHP 類。該類是所有基於 PHP 的 SOAP 服務的核心部分,其語法如下:
$server = new SoapServer($wsdl [, $options]);
其中,$wsdl 是描述托管服務的 Web 服務描述語言 (WSDL) 文檔的位置;$options 是一組鍵/值對,其中包含了在創建服務時需要考慮的所有設置選項。稍後,您將了解有關 WSDL 文檔的更多內容;現在,我們來看一下在創建新的 SOAP 服務時可用的選項:
◆soap_version:與客戶端通信時使用的 SOAP 協議版本。可能的選項是用於 SOAP 1.1 版的常量 SOAP_1_1 或用於 SOAP 1.2 版的 SOAP_1_2。
◆encoding:用於該 SOAP 服務的字符編碼(即字符串 ISO-8859-1)。
◆actor:該 SOAP 服務的角色 URI。
◆classmap:將 WSDL 數據類型映射到 PHP 中的類名的一組鍵/值對本身。如果使用該選項,PHP 將根據 WSDL 中定義的類型將這些類呈現給連接客戶端。
因此,要使用名為 bookman.wsdl 的 WSDL 文檔創建一個使用 SOAP v1.2 協議的 SOAP 服務,您應該按如下方法構建服務器:
$server = new SoapServer(“bookman.wsdl”, array(‘soap_version’ => SOAP_1_2));
該過程的下一步是創建服務方法。在 PHP 中,這可以使用兩個主要方法完成。第一個(也是最靈活的)方法是使用 addFunction() 方法手動指定要托管在服務中的每個函數,並將函數名傳遞給該方法以公開到客戶端:
function add($a, $b) {return $a + $b;}$server->addFunction(‘add’);
您還可以通過提供一組函數名來添加多個函數:
function add($a, $b) {return $a + $b;}function sub($a, $b) {return $a - $b;}$server->addFunction(array(‘add’, ‘sub’));
最後,您可以通過傳遞特殊常量 SOAP_FUNCTIONS_ALL 而非函數名來導出所有定義的函數,如下所示:
function add($a, $b) {return $a + $b;}function sub($a, $b) {return $a - $b;}$server->addFunction(SOAP_FUNCTIONS_ALL);
1