探討Hessian在PHP中的流量分析

來源:互聯網
上載者:User

什麼是Hessian
  Hessian是由caucho提供的一種開源的遠程通訊協議。
  採用二進位 RPC 協議,基於 HTTP 傳輸,伺服器端不用另開放防火牆連接埠。
  協議的規範是公開的,可以用於任意語言。
  採用客戶機/伺服器模式。
  請求程式就是一個客戶機,而服務提供者就是一個伺服器。
  客戶機調用進程發送一個有進程參數的調用資訊到服務進程,然後等待應答資訊。
  在伺服器端,進程保持睡眠狀態直到調用資訊的到達為止。
  當一個調用資訊到達,伺服器獲得進程參數,計算結果,發送回覆資訊,然後等待下一個調用資訊,最後,用戶端調用進程接收回覆資訊,
  獲得進程結果,然後調用執行繼續進行。

Hessian協議工作流程圖
  用戶端程式請求服務端函數 
  1.調用用戶端控制代碼,執行傳送參數。
  2.調用本地系統核心發送網路訊息。
  3.訊息傳送到遠程主機。
  4.伺服器控制代碼得到訊息並取得參數。
  5.執行遠程過程。

服務端函數返回結果給用戶端
  1.執行的過程將結果返回伺服器控制代碼。
  2.伺服器控制代碼返回結果,調用遠程系統核心。
  3.訊息傳回本地主機。
  4.客戶控制代碼由核心接收訊息。
  5.客戶接收控制代碼返回的資料。

附帶源碼解釋

1.引用設定檔,包括網站根目錄,以及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.佈建服務端。
複製代碼 代碼如下:<?php
/**
* 檔案名稱 : server.php
*
* 參考資料 :
* 1.http://hessian.caucho.com/ ( Hessian首頁 )
* 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() {}
/**
* 商品詳細資料APi介面
* @param string $title 標題
* @param int $price 價格
*/
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協議調用遠程方法.</h1> 標題:' . $title . '<br>價格:'.$price;
}
}

$server = new HessianService( new HessianServer() );
//$server->displayInfo();
$server->handle();

// IDE : Zend Studio 9.0
// IDE Extension : Toggle Vrapper
?>

3.可以通過HessianService類中的displayInfo方法去查看開啟多少個通訊方法。
如果搭建服務端要使用handle方法,如出現Hessian Requires POST提示,服務端就已經搭建成功。

4.封裝Hessian介面

複製代碼 代碼如下:<?php
/**
* 類名 : HessianApi
*
* 參考資料 :
* 1.http://hessian.caucho.com/ ( Hessian首頁 )
* 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 存放單例模式數組
*/
private static $_objects = array();

/**
* 設定URL地址
* 執行個體化HessianClient類
* 參數 : (1) url地址 , 2
*
* 2.Java調用欄位
* @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;
}

/**
* 設定控制代碼
* @param result $_handle
*/
public function setHandler($_handle) {
$this->_handle = $_handle;
}

/**
* 擷取URL地址
*/
public function getUrl() {
return $this->_url;
}

/**
* 設定URL地址
* @param string $url
*/
public function setUrl($url) {
$this->_url = $url;
}

/**
* typeMap映射Java等平台對象
* @return array
*/
public function getOptions() {
return array (
      'version' => 1,
      'saveRaw' => TRUE,
      'typeMap' => array(
        'JavaNullPointException' => 'java.lang.NullPointerException' ,
        'StackTraceElement' => 'java.lang.StackTraceElement')
     );
}

/**
* 記錄介面調用資訊
* @param string $method 調用的方法
* @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');
}

/**
* 靜態Factory 方法,產生單個URL的唯一執行個體
* @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.封裝用戶端要求方法,繼承HessianApi類
複製代碼 代碼如下:<?php
/**
* 類名 : Goods
* 繼承類 : HessianApi
* 用途 : 調用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
{
/**
* 設定介面地址
* @param string $url
*/
public function __construct( $url ) {
parent::__construct( $url );
}

/**
* 擷取商品資訊
* 調用server.php檔案中的goodsInfomationApi方法
* @param string $title 標題
* @param string $title 價格
*/
public function getGoodsInfomation( $title , $price )
{
// 如果調用java平台的hessian服務 需要指定你傳遞參數的類型,特別是整形和字串.
$price = (int) $price;

$result = $this->getHandler()->goodsInfomationApi( $title , $price );
$this->resultLog( 'getGoodsInfomation' , '提供者,但介面沒有進行邏輯驗證.');
return $result;
}
}

// IDE : Zend Studio 9.0
// IDE Extension : Toggle Vrapper
?>

6.修改index.php可以請求服務端介面
複製代碼 代碼如下:<?php
/**
* 檔案名稱 : index.php
*
* 參考資料 :
* 1.http://hessian.caucho.com/ ( Hessian首頁 )
* 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 擴充及設定檔
require_once ( PATH . 'extensions/HessianPHP/HessianClient.php' );
require_once ( PATH . 'class/HessianApi.php' );

// 調用 server.php 方法
require_once ( PATH . 'class/Goods.php');

// 請求介面擷取資料
$goods = new Goods( HESSIAN_URL );

// 設定商品標題 , 價格.
$title = '北京移動儲值平台';
$price = '50';

// 請求Hessian協議
$goodsInfo = $goods->getGoodsInfomation( (string) $title , (int) $price );

// 列印請求結果
echo ( $goodsInfo );

// IDE : Zend Studio 9.0
// IDE Extension : Toggle Vrapper

?>

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.