544
人物
PHP_SOAP_擴展_PHP SOAP 擴展詳解
PHP SOAP 擴展[kuo zhan]
SOAP 的全稱為簡單對象[dui xiang][dan dui xiang]訪問協議[xie yi] (Simple Object Access Protocol)。它是一種基於 XML 的,可擴展[kuo zhan]的[ke kuo zhan de]通信[tong xin]協議[xie yi][tong xin xie yi]。SOAP 提供了一種標準,使得運行[yun hang]在不同 平台[ping tai] 上並使用不同的編程[bian cheng] 語言[yu yan] 編寫的 應用[ying yong] 程序 可以互相進行通信[tong xin]。SOAP 的可擴展[kuo zhan]性[ke kuo zhan xing]和平台[ping tai]無關性使得它被廣泛用作 Web 服務 的通信[tong xin]協議[xie yi][tong xin xie yi]。
由於 java 語言[yu yan]提供了對 SOAP 的良好支持[zhi chi],通常基於 Web 服務的應用[ying yong]程序[ying yong cheng xu]使用 Java 語言[yu yan]編寫。對於廣大的 PHP 程序員[cheng xu yuan]來說,可能會有一點小小的不滿 – PHP 的較早版本根本沒有對 SOAP 的直接支持[zhi chi],隻能通過 PEAR(the PHP Extension and Application Repository) 中的 SOAP 庫或者第三方[di san fang]產品 NuSOAP 來 開發 Web 服務。不過最近的版本已經改變了這一狀況。自 PHP 5 開始新增了內置的 SOAP 擴展[kuo zhan] (ext/soap),從此我們不需要下載[xia zai]額外的擴展[kuo zhan]庫或是 代碼[dai ma] 包來開發基於 SOAP 的應用[ying yong]程序[ying yong cheng xu]了。接下來讓我們來看看 SOAP 擴展[kuo zhan]中都有哪些內容。
PHP 5 中的 SOAP 擴展[kuo zhan] (ext/soap) PHP 5 最早發布的版本 5.0.0 中就已經提供了 SOAP 擴展[kuo zhan],不過當時的 PHP 手冊中聲明[sheng ming]這個擴展[kuo zhan]是試驗性 (experimental) 的。實際上當時的版本已經實現了比較完善的 功能 ,也沒有必要為此而擔心。目前這個擴展[kuo zhan]還在不斷地完善,早期版本中的大部分 bug 都已經得到了修正,目前最新的版本 (5.3.0) 中已經提供了比較完整的對 SOAP 的支持[zhi chi],而且我們有理由相信[xiang xin],以後的版本還會更好。
SOAP 擴展[kuo zhan]庫結構[jie gou]
ext/soap 中包括六個預定義的類,通過這些類,我們可以創建 Web 服務端 (SoapServer 類 ),客戶[ke hu]端 (SoapClient 類 ),處理 SOAP 請求[qing qiu]和應答[ying da] (SoapHeader, SoapParam, SoapVar 類 ),診斷[zhen duan]錯誤[cuo wu] (SoapFault 類 )。這些類之間的聯係[lian xi]如圖 1 所示:
圖 1. SOAP 擴展[kuo zhan]的結構[jie gou]
SOAP 服務類 SoapServer
SoapServer 類用來開發 Web 服務端應用[ying yong]程序[ying yong cheng xu]。這個類中包含創建,設置[she zhi]和操縱 Web 服務的 函數[han shu] 。有兩種方式可以向 Web 服務中添加操作 (Operation)。一種方式是直接添加已定義的函數[han shu],另一種方式是添加已定義好的類,從而將該類的公有成員[gong you cheng yuan]函數[han shu]添加到 Web 服務中。
另一個需要說明[shuo ming]的特性是,PHP 支持[zhi chi]兩種 Web 服務的 模式[mo shi] :WSDL 模式[mo shi]和 non-WSDL 模式[mo shi],為了便於理解,我們首先從 Web 服務的兩種實現模式[mo shi]開始說起。
PHP 中 Web 服務的兩種模式[mo shi]:WSDL 模式[mo shi]和 non-WSDL 模式[mo shi]
對於 Web 服務來說,主要有兩種實現模式[mo shi] – 契約先行 (Contract First) 模式[mo shi]和代碼[dai ma]先行 (Code Fist) 模式[mo shi]。
契約先行模式[mo shi]的實現中,首要工作是定義針對這個 Web 服務的借口的 WSDL(Web Services Description Language,Web 服務描述語言[yu yan] ) 文件[wen jian] 。WSDL 文件[wen jian]中描述了 Web 服務的位置[wei zhi],可提供的操作集,以及其他一些屬性[shu xing]。WSDL 文件[wen jian]也就是 Web 服務的“契約”。“契約”訂立之後,再據此進行服務器[fu wu qi]端和客戶[ke hu]端的應用[ying yong]程序[ying yong cheng xu]開發。這種模式[mo shi]對應上節所說的 WSDL 模式[mo shi]。我們後文中介紹的例子就是使用這一模式[mo shi]實現的。
與契約先行模式[mo shi]不同,代碼[dai ma]先行模式[mo shi]中,第一步工作是實現 Web 服務端,然後根據服務端的實現,用某種方法[fang fa](自動生成或手工編寫)生成 WSDL 文件[wen jian]。但是由於 PHP 本身並沒有提供從 Web 服務實現代碼[dai ma]中生成 WSDL 文件[wen jian]的方法[fang fa],因此就要以 non-WSDL 模式[mo shi]連接[lian jie]服務端,即不通過 WSDL 文件[wen jian]創建[wen jian chuang jian] SoapServer 和 SoapClient 示例,而是直接向構造函數[han shu][gou zao han shu]傳遞必要的參數[can shu]。當然,代碼[dai ma]先行模式[mo shi]也有其他的解決方法[fang fa],一些集成[ji cheng]的 PHP 開發 工具 (如 Zend Studio)就提供了根據 Web 服務實現代碼[dai ma]生成[dai ma sheng cheng] WSDL 文件[wen jian]的功能。
SOAP 客戶[ke hu]端類 SoapClient
SOAP 客戶[ke hu]端類 SoapClient 用於[yong yu]開發 Web 服務的客戶[ke hu]端程序。可用的成員函數[han shu][cheng yuan han shu]主要有創建客戶[ke hu]端實例,調用[tiao yong]可用操作,查詢可用操作和數據[shu ju]類型[lei xing][shu ju lei xing]等。除此之外還包括了可用於[yong yu]程序調試[tiao shi]的函數[han shu] – 獲取上次請求[qing qiu]和應答[ying da]的 SOAP 數據[shu ju]。
SOAP 參數[can shu]類 SoapHeader, SoapParam, SoapVar
SoapParam 和 SoapVar 主要用來封裝[feng zhuang]用於[yong yu]放入 SOAP 請求[qing qiu]中的數據[shu ju],他們主要在 non-WSDL 模式[mo shi]下使用。事實上,在 WSDL 模式[mo shi]下,SOAP 請求[qing qiu]的參數[can shu]可以通過數組[shu zu]方式包裝,SOAP 擴展[kuo zhan]會根據 WSDL 文件[wen jian]將這個數組[shu zu]轉化成為 SOAP 請求[qing qiu]中的數據[shu ju]部分,所以並不需要這兩個類。而在 non-WSDL 模式[mo shi]下,由於沒有提供 WSDL 文件[wen jian],所以必須通過這兩個類進行包裝。
SoapHeader 類用來構造 SOAP 頭,SOAP 頭可以對 SOAP 的能力[neng li]進行必要的擴展[kuo zhan]。SOAP 頭的一個主要作用[zuo yong]就是用於[yong yu]簡單的身份[shen fen]認證[ren zheng],後麵會有例子說明[shuo ming]這一點。
SOAP 異常[yi chang]類 SoapFault
這個類從 PHP 的 Exception 類繼承[ji cheng]而來,可以用來實現 SOAP 中的異常[yi chang]處理[yi chang chu li]機製[ji zhi],由 SOAP 服務端拋出[pao chu]。SOAP 客戶[ke hu]端可以接收該類的實例,用於[yong yu]獲取有用的調試[tiao shi]信息[xin xi]。
安裝[an zhuang] SOAP 擴展[kuo zhan] 為了使用 SOAP 擴展[kuo zhan],我們就需要在 Web 服務器[fu wu qi]上安裝[an zhuang]它。這裏有幾個因素需要考慮。 安裝[an zhuang]的前置條件[tiao jian][qian zhi tiao jian]:在官方的使用手冊中可以找到,ext/soap 擴展[kuo zhan]使用了 GNOME XML 庫,因此在安裝[an zhuang] SOAP 擴展[kuo zhan]之前需要安裝[an zhuang]這個庫(需要 2.5.4 以上版本)。 PHP 是否已安裝[an zhuang]: 如果你想在安裝[an zhuang] PHP 的同時加入 SOAP 擴展[kuo zhan],那再簡單不過了。如果是下載[xia zai] PHP 源代碼[dai ma][yuan dai ma]自己編譯[bian yi]安裝[an zhuang]的情況[qing kuang],則隻需要在編譯[bian yi]時[bian yi shi]的 configure 命令[ming ling]中添加選項[xuan xiang] –enable-soap 即可。如果是直接使用二進製[er jin zhi]文件[wen jian][er jin zhi wen jian]安裝[an zhuang](通常隻用於[yong yu] Windows 平台[ping tai]),安裝[an zhuang]包中則已經包括了這一擴展[kuo zhan],不需要額外安裝[an zhuang]。 而如果需要在已經安裝[an zhuang]好的 PHP 上添加 SOAP 擴展[kuo zhan],需要做的工作就要多一些。在編譯[bian yi] SOAP 擴展[kuo zhan]的源代碼[dai ma][yuan dai ma]之前需要使用 phpize 命令[ming ling]設置[she zhi]編譯[bian yi]環境,然後再使用 configure 命令[ming ling],之後編譯[bian yi]並安裝[an zhuang] SOAP 擴展[kuo zhan]。
編譯[bian yi]安裝[an zhuang] SOAP 擴展[kuo zhan]之後,我們還需要修改[xiu gai] PHP 的配置[pei zhi]文件[wen jian][pei zhi wen jian],以便 SOAP 擴展[kuo zhan]可以正確的被 PHP 加載。對於 Linux 平台[ping tai]來說,需要在 php.ini 中加入如下代碼[dai ma]:
extension = php_soap.so [/pre]
而對於 Windows 平台[ping tai],需要加入的代碼[dai ma]為:
extension = php_soap.dll [/pre]
除此之外,可能還需要設置[she zhi]擴展[kuo zhan]庫的位置[wei zhi],這一信息[xin xi]在 php.ini 的 extension_dir 域中保存,例如:
extension_dir = “/usr/local/php/lib/”[/pre]
上麵的工作完成之後,還需要注意的是 SOAP 擴展[kuo zhan]在配置[pei zhi]文件[wen jian][pei zhi wen jian]中有獨立[du li]的代碼[dai ma]段:
清單 1.php.ini 中 SOAP 擴展[kuo zhan]的設置[she zhi]
soap]; Enables or disables WSDL caching feature.soap.wsdl_cache_enabled=1; Sets the directory name where SOAP extension will put cache files.soap.wsdl_cache_dir=”C:\xampp\tmp”; (time to live) Sets the number of second while cached file will be used; instead of original one.soap.wsdl_cache_ttl=86400
文章來源於網絡
最後更新:2017-01-04 22:34:58