探討Hessian在PHP中的使用分析
什么是Hessian
Hessian是由caucho提供的一種開源的遠(yuǎn)程通訊協(xié)議。
采用二進(jìn)制 RPC 協(xié)議,基于 HTTP 傳輸,服務(wù)器端不用另開放防火墻端口。
協(xié)議的規(guī)范是公開的,可以用于任意語(yǔ)言。
采用客戶機(jī)/服務(wù)器模式。
請(qǐng)求程序就是一個(gè)客戶機(jī),而服務(wù)提供程序就是一個(gè)服務(wù)器。
客戶機(jī)調(diào)用進(jìn)程發(fā)送一個(gè)有進(jìn)程參數(shù)的調(diào)用信息到服務(wù)進(jìn)程,然后等待應(yīng)答信息。
在服務(wù)器端,進(jìn)程保持睡眠狀態(tài)直到調(diào)用信息的到達(dá)為止。
當(dāng)一個(gè)調(diào)用信息到達(dá),服務(wù)器獲得進(jìn)程參數(shù),計(jì)算結(jié)果,發(fā)送答復(fù)信息,然后等待下一個(gè)調(diào)用信息,最后,客戶端調(diào)用進(jìn)程接收答復(fù)信息,
獲得進(jìn)程結(jié)果,然后調(diào)用執(zhí)行繼續(xù)進(jìn)行。
Hessian協(xié)議工作流程圖
客戶端程序請(qǐng)求服務(wù)端函數(shù)
1.調(diào)用客戶端句柄,執(zhí)行傳送參數(shù)。
2.調(diào)用本地系統(tǒng)內(nèi)核發(fā)送網(wǎng)絡(luò)消息。
3.消息傳送到遠(yuǎn)程主機(jī)。
4.服務(wù)器句柄得到消息并取得參數(shù)。
5.執(zhí)行遠(yuǎn)程過(guò)程。
服務(wù)端函數(shù)返回結(jié)果給客戶端
1.執(zhí)行的過(guò)程將結(jié)果返回服務(wù)器句柄。
2.服務(wù)器句柄返回結(jié)果,調(diào)用遠(yuǎn)程系統(tǒng)內(nèi)核。
3.消息傳回本地主機(jī)。
4.客戶句柄由內(nèi)核接收消息。
5.客戶接收句柄返回的數(shù)據(jù)。
附帶源碼解釋
1.引用配置文件,包括網(wǎng)站根目錄,以及Hessian的地址。
<?php
/**
* 文件名 : config.php
* 用途 : Hessian配置文件
*
* @package system.core.code applied to the whole site
* @copyright Copyright (c) 2012
* @since 1.0
*/
// 根目錄
define( 'PATH' , dirname(__FILE__) . DIRECTORY_SEPARATOR );
// Hessian Url地址
define( 'HESSIAN_URL' , 'http://qx.com/server.php' );
// IDE : Zend Studio 9.0
// IDE Extension : Toggle Vrapper
?>
2.配置服務(wù)端。
<?php
/**
* 文件名 : server.php
*
* 參考資料 :
* 1.http://hessian.caucho.com/ ( Hessian主頁(yè) )
* 2.http://hessianphp.sourceforge.net/ ( Hessian PHP )
* 3.http://sourceforge.net/projects/hessianphp/ ( Hessian PHP開源 )
* 4.http://baike.baidu.com/view/1859857.htm ( 單例模式 )
*
* @author wubaiqing <xinxiangmo@gmail.com>
* @package system.core applied to the whole site
* @copyright Copyright (c) 2012
* @since 1.0
*/
require_once ( dirname(__FILE__) . DIRECTORY_SEPARATOR . 'config.php' );
require_once ( PATH . 'extensions/HessianPHP/HessianService.php' );
class HessianServer
{
public function __construct() {}
/**
* 商品詳細(xì)信息APi接口
* @param string $title 標(biāo)題
* @param int $price 價(jià)格
*/
public function goodsInfomationApi( $title , $price ) {
$price = (int) $price;
return '<h1 style="background-color:#036; color:#fff; font-size:16px; padding:10px 10px 10px 3px;">使用Hessian協(xié)議調(diào)用遠(yuǎn)程方法.</h1> 標(biāo)題:' . $title . '<br>價(jià)格:'.$price;
}
}
$server = new HessianService( new HessianServer() );
//$server->displayInfo();
$server->handle();
// IDE : Zend Studio 9.0
// IDE Extension : Toggle Vrapper
?>
3.可以通過(guò)HessianService類中的displayInfo方法去查看開啟多少個(gè)通訊方法。
如果搭建服務(wù)端要使用handle方法,如出現(xiàn)Hessian Requires POST提示,服務(wù)端就已經(jīng)搭建成功。
4.封裝Hessian接口
<?php
/**
* 類名 : HessianApi
*
* 參考資料 :
* 1.http://hessian.caucho.com/ ( Hessian主頁(yè) )
* 2.http://hessianphp.sourceforge.net/ ( Hessian PHP )
* 3.http://sourceforge.net/projects/hessianphp/ ( Hessian PHP開源 )
* 4.http://baike.baidu.com/view/1859857.htm ( 單例模式 )
*
* @author wubaiqing <xinxiangmo@gmail.com>
* @package system.core applied to the whole site
* @copyright Copyright (c) 2012
* @since 1.0
*/
class HessianApi
{
/**
* @var string 接口地址
*/
private $_url = NULL;
/**
* @var result 句柄
*/
private $_handle = NULL;
/**
* @var array 存放單例模式數(shù)組
*/
private static $_objects = array();
/**
* 設(shè)置URL地址
* 實(shí)例化HessianClient類
* 參數(shù) : (1) url地址 , 2
*
* 2.Java調(diào)用字段
* @param string $url
*/
public function __construct( $url )
{
$this->setUrl( $url );
$handler = new HessianClient ( $this->getUrl (), $this->getOptions () );
$this->setHandler ( $handler );
}
/**
* @return result $_handle 句柄
*/
public function getHandler() {
return $this->_handle;
}
/**
* 設(shè)置句柄
* @param result $_handle
*/
public function setHandler($_handle) {
$this->_handle = $_handle;
}
/**
* 獲取URL地址
*/
public function getUrl() {
return $this->_url;
}
/**
* 設(shè)置URL地址
* @param string $url
*/
public function setUrl($url) {
$this->_url = $url;
}
/**
* typeMap映射Java等平臺(tái)對(duì)象
* @return array
*/
public function getOptions() {
return array (
'version' => 1,
'saveRaw' => TRUE,
'typeMap' => array(
'JavaNullPointException' => 'java.lang.NullPointerException' ,
'StackTraceElement' => 'java.lang.StackTraceElement')
);
}
/**
* 記錄接口調(diào)用信息
* @param string $method 調(diào)用的方法
* @param string $returnMsg 需要記入log的文字信息
*/
public function resultLog( $method , $returnMsg )
{
$logPath = PATH.'/runtime/hessian/';
if( !is_dir( $logPath ) ) {
mkdir($logPath,0777);
}
error_log(date('Ymd H:i:s', time()) . '|' . $method . '|' . $returnMsg."\n", 3, $logPath . date('Y-m-d', time()) . '.log');
}
/**
* 靜態(tài)工廠方法,生成單個(gè)URL的唯一實(shí)例
* @param string $url
*/
public static function start( $url )
{
$key = md5( $url );
if ( isset(self::$_objects[$key]) ) {
return self::$_objects[$key];
}
self::$_objects[$key] = new HessianApi( $url );
return self::$_objects[$key];
}
}
class JavaNullPointException extends Exception {}
class StackTraceElement extends Exception {}
// IDE : Zend Studio 9.0
// IDE Extension : Toggle Vrapper
?>
5.封裝客戶端請(qǐng)求方法,繼承HessianApi類
<?php
/**
* 類名 : Goods
* 繼承類 : HessianApi
* 用途 : 調(diào)用server.php方法
*
* @author wubaiqing <xinxiangmo@gmail.com>
* @package system.core.code applied to the whole site
* @copyright Copyright (c) 2012
* @since 1.0
*/
class Goods extends HessianApi
{
/**
* 設(shè)置接口地址
* @param string $url
*/
public function __construct( $url ) {
parent::__construct( $url );
}
/**
* 獲取商品信息
* 調(diào)用server.php文件中的goodsInfomationApi方法
* @param string $title 標(biāo)題
* @param string $title 價(jià)格
*/
public function getGoodsInfomation( $title , $price )
{
// 如果調(diào)用java平臺(tái)的hessian服務(wù) 需要指定你傳遞參數(shù)的類型,特別是整形和字符串.
$price = (int) $price;
$result = $this->getHandler()->goodsInfomationApi( $title , $price );
$this->resultLog( 'getGoodsInfomation' , '訪問(wèn)接口,但接口沒(méi)有進(jìn)行邏輯驗(yàn)證.');
return $result;
}
}
// IDE : Zend Studio 9.0
// IDE Extension : Toggle Vrapper
?>
6.修改index.php可以請(qǐng)求服務(wù)端接口
<?php
/**
* 文件名 : index.php
*
* 參考資料 :
* 1.http://hessian.caucho.com/ ( Hessian主頁(yè) )
* 2.http://hessianphp.sourceforge.net/ ( Hessian PHP )
* 3.http://sourceforge.net/projects/hessianphp/ ( Hessian PHP開源 )
* 4.http://baike.baidu.com/view/1859857.htm ( 單例模式 )
*
* @author wubaiqing <xinxiangmo@gmail.com>
* @package system.core applied to the whole site
* @copyright Copyright (c) 2012
* @since 1.0
*/
require_once ( dirname(__FILE__) . DIRECTORY_SEPARATOR .'config.php' );
// Hessian 擴(kuò)展及配置文件
require_once ( PATH . 'extensions/HessianPHP/HessianClient.php' );
require_once ( PATH . 'class/HessianApi.php' );
// 調(diào)用 server.php 方法
require_once ( PATH . 'class/Goods.php');
// 請(qǐng)求接口獲取數(shù)據(jù)
$goods = new Goods( HESSIAN_URL );
// 設(shè)置商品標(biāo)題 , 價(jià)格.
$title = '北京移動(dòng)充值平臺(tái)';
$price = '50';
// 請(qǐng)求Hessian協(xié)議
$goodsInfo = $goods->getGoodsInfomation( (string) $title , (int) $price );
// 打印請(qǐng)求結(jié)果
echo ( $goodsInfo );
// IDE : Zend Studio 9.0
// IDE Extension : Toggle Vrapper
?>
相關(guān)文章
PHP對(duì)京東聯(lián)盟CPS的API調(diào)用
這篇文章介紹了PHP調(diào)用京東聯(lián)盟API的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07php操作sqlserver關(guān)于時(shí)間日期讀取的小小見解
以前一直在用mysql對(duì)sqlserver不是很熟悉,于是摸著石頭過(guò)河。沒(méi)有別的至少mysql和sqlserver還算是親戚 做條件查詢的時(shí)候。出現(xiàn)了問(wèn)題2009-11-11PHP中單引號(hào)與雙引號(hào)的區(qū)別分析
在PHP中,我們可以使用單引號(hào)或者雙引號(hào)來(lái)表示字符串。不過(guò)我們作為開發(fā)者,應(yīng)該了解其中的區(qū)別。單引號(hào)與雙引號(hào)對(duì)于定義字符一個(gè)是可以解析變量一個(gè)是會(huì)把變量直接輸出來(lái),同時(shí)單引號(hào)與雙引號(hào)在字符處理上單引號(hào)要優(yōu)與雙引號(hào)2014-08-08PHP-CGI進(jìn)程CPU 100% 與 file_get_contents 函數(shù)的關(guān)系分析
有時(shí)候,運(yùn)行 Nginx、PHP-CGI(php-fpm) Web服務(wù)的 Linux 服務(wù)器,突然系統(tǒng)負(fù)載上升,使用 top 命令查看,很多 php-cgi 進(jìn)程 CPU 使用率接近100%。2011-08-08PHP實(shí)現(xiàn)的注冊(cè),登錄及查詢用戶資料功能API接口示例
這篇文章主要介紹了PHP實(shí)現(xiàn)的注冊(cè),登錄及查詢用戶資料功能API接口,結(jié)合具體實(shí)例形式分析了php服務(wù)器端用戶注冊(cè)、登陸、查詢及curl登陸查詢功能實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-06-06sourcesafe管理phpproj文件的補(bǔ)充說(shuō)明(downmoon)
在使用vs.php+ sourcesafe管理代碼時(shí),發(fā)現(xiàn)有時(shí)候并不能從vs.net IDE中正確獲取phpproj文件下的所有文件。但從sourcesafe IDE下卻可以。2009-04-04PHP組合模式Composite Pattern優(yōu)點(diǎn)與實(shí)現(xiàn)過(guò)程
這篇文章主要介紹了PHP組合模式Composite Pattern優(yōu)點(diǎn)與實(shí)現(xiàn),組合模式是一種結(jié)構(gòu)型模式,它允許你將對(duì)象組合成樹形結(jié)構(gòu)來(lái)表示“部分-整體”的層次關(guān)系。組合能讓客戶端以一致的方式處理個(gè)別對(duì)象和對(duì)象組合2023-03-03php curl 偽造IP來(lái)源的實(shí)例代碼
php curl 太強(qiáng)大了,它不但可以模仿用戶登錄,還可以模仿用戶IP地址哦,為偽造IP來(lái)源,本實(shí)例僅供參考哦2012-11-11php使用ffmpeg獲取視頻信息并截圖的實(shí)現(xiàn)方法
這篇文章主要介紹了php使用ffmpeg獲取視頻信息并截圖的實(shí)現(xiàn)方法,實(shí)例分析了php操作視頻與圖像的相關(guān)技巧,需要的朋友可以參考下2016-05-05