因為看到有人問 Nusoap 和 PHPRPC 的比較,為了讓大家能夠更清楚地了解 Nusoap 和 PHPRPC 的關系,所以在這裡做一個簡要的說明性介紹,所寫的內容也不是面面俱到的,只寫了一些主要的比較。更多細節的比較大家可以在使用中自己來對比。
Nusoap 是一個用於 PHP 的 Web Service 實現。PHP 版本的 PHPRPC 協議實現跟 Nusoap 是一個級別的東西。但是 PHPRPC 協議是跟 Web Service 一個級別的東西,所以下面我們來把 Nusoap 實現跟 PHP 版本的 PHPRPC 協議實現進行比較,把 Web Service 和 PHPRPC 協議進行比較。
第一、協議比較:
相同之處:
這兩個協議都是基於 HTTP 協議的,都可以使用 POST 方法提交請求。
主要不同之處:
(1) 請求:WebService 雖然也支持 GET 方式提交請求,但是一般不常用,常用的方式是利用 POST 方法提交 SOAP 格式的請求。而 PHPRPC 支持 GET 和 POST 兩種方式來提交請求,請求格式是最常見的 application/x-www-form-urlencoded 格式,這對於實現一個浏覽器客戶端來說更加容易。
(2) 響應:WebService 返回的響應是 SOAP 格式的數據,對於浏覽器客戶端來說,只有利用 XMLHttpRequest 才能夠對其進行處理,因為 XMLHttpRequest 收到跨域調用的限制,因此 WebService 的浏覽器客戶端無法做到跨域調用服務。PHPRPC 的響應格式是兼容於 JavaScript 格式的純文本,因此返回的響應可以直接作為腳本執行,因此實現浏覽器客戶端可以完全不依賴於 XMLHttpRequest,利用純 JavaScript 即可實現一個浏覽器客戶端,而浏覽器允許跨域下載並執行腳本,因此 PHPRPC 的浏覽器客戶端可以做到跨域調用。
(3) 數據交換格式:WebService 中所使用的 SOAP 格式是基於 XML 語言定義的,XML 語言是純文本的,因為其中的某些位置可以增加或刪除一些空白(空格、制表符、回車或換行)而不影響其所表示的內容,因此其格式可以整理成便於人來閱讀的,但也由於這點的靈活性,對於機器處理來說效率偏低。而 PHPRPC 的數據交換格式是 PHP 序列化格式,PHP 序列化格式可以算是半純文本的,因為其數據的表示格式也是采用人類可讀的方式表示的,但其中任何位置都不可以插入多於的空白,它對機器的可讀性作了很好的支持,不但提供了有效的分隔符,並且提供了字符串長度、數組元素個數、對象成員個數等信息,所以更有利於機器高速處理。因為協議本質上是機機語言,而不是計算機程序設計語言,計算機程序設計語言是人機語言,它應該更偏重於人類可讀性,而機機語言應該更重視機器可讀性。因此可以說 PHP 序列化格式在人類可讀性和機器可讀性之間做到了非常好的平衡。
(4) 帶寬占用:WebService 是重量級的 Web 服務,其數據格式冗長拖沓,占用網絡帶寬高。PHPRPC 是輕量級的 Web 服務,其數據格式簡單緊湊,占用網絡帶寬低。注意,這裡所說到重量級和輕量級是指網絡帶寬占用,而不是指其提供服務的能力,PHPRPC 所提供的服務能力絕不遜色於 WebService,甚至在很多地方優於 WebService。打個比方說:WebService 就像是 OSI 的 7 層網絡模型,看似完美,但實現復雜,使用困難。而 PHPRPC 則像是簡化了的 TCP/IP 的 5 層網絡模型,實現高效,使用方便。
第二、然後我們再來比較 Nusoap 和 PHP 版本的 PHPRPC協議實現:
相同之處是都用於 PHP。
不同之處主要在於易用性上,Nusoap 雖然在易用性上做的還算不錯,但是跟 PHP 版本的 PHPRPC 協議實現來比較就差太遠了。例如,利用 Nusoap 發布的服務函數需要單獨編寫,而不能使用跟本地函數同樣的方式進行編寫,更無法使用 PHP 中內置擴展的函數,而 PHPRPC 所發布的函數跟本地函數完全一樣,甚至包括 PHP 內置擴展的函數也可以直接發布。要用 Nusoap 發布一個 wsdl,需要為每一個發布的過程的名稱、參數名、參數類型、返回值類型、名空間、動作、樣式、文檔等內容進行定義。而要發布一個 PHPRPC 服務,只需要告訴服務器要發布的那個函數(也可以是對象方法或類方法)的名字(還可以給出別名)即可。而不需要給出參數名、參數類型、返回值類型等信息。因此對於變長參數,可變類型參數的支持更好。在 PHPRPC 客戶端的使用上,也是同樣的方便,可以直接以遠程函數名命名的本地 PHPRPC 客戶端的方法來調用遠程函數,而 Nusoap 相對來說比較麻煩一些。PHPRPC 還有一個很大的優勢在於,它可以讓你很輕松的以安全加密傳輸的方式來進行遠程調用,這一點 Nusoap 是做不到的。