探讨Hessian在PHP中的使用分析


Posted in PHP onJune 13, 2013

什么是Hessian

Hessian是由caucho提供的一种开源的远程通讯协议。

采用二进制 RPC 协议,基于 HTTP 传输,服务器端不用另开放防火墙端口。

协议的规范是公开的,可以用于任意语言。

采用客户机/服务器模式。

请求程序就是一个客户机,而服务提供程序就是一个服务器。

客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。

在服务器端,进程保持睡眠状态直到调用信息的到达为止。

当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,

获得进程结果,然后调用执行继续进行。

Hessian协议工作流程图

客户端程序请求服务端函数 

1.调用客户端句柄,执行传送参数。

2.调用本地系统内核发送网络消息。

3.消息传送到远程主机。

4.服务器句柄得到消息并取得参数。

5.执行远程过程。

探讨Hessian在PHP中的使用分析

服务端函数返回结果给客户端

1.执行的过程将结果返回服务器句柄。

2.服务器句柄返回结果,调用远程系统内核。

3.消息传回本地主机。

4.客户句柄由内核接收消息。

5.客户接收句柄返回的数据。

探讨Hessian在PHP中的使用分析

附带源码解释

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');
    }
    /**
     * 静态工厂方法,生成单个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
?>

PHP 相关文章推荐
Ext.data.PagingMemoryProxy分页一次性读取数据的实现代码
Apr 07 PHP
PHP数组实例总结与说明
Aug 23 PHP
php中一个完整表单处理实现代码
Nov 10 PHP
thinkphp 多表 事务详解
Jun 17 PHP
浅析Mysql 数据回滚错误的解决方法
Aug 05 PHP
php开启openssl的方法
May 15 PHP
php中error与exception的区别及应用
Jul 28 PHP
PHP中让curl支持sock5的代码实例
Jan 21 PHP
浅谈PHP中try{}catch{}的使用方法
Dec 09 PHP
PHP文件系统管理(实例讲解)
Sep 19 PHP
如何通过View::first使用Laravel Blade的动态模板详解
Sep 21 PHP
PHP中define() 与 const定义常量的区别详解
Jun 25 PHP
深入PHP变量存储的详解
Jun 13 #PHP
深入PHP中的HashTable结构详解
Jun 13 #PHP
基于PHP输出缓存(output_buffering)的深入理解
Jun 13 #PHP
php缓冲 output_buffering的使用详解
Jun 13 #PHP
如何在PHP中使用正则表达式进行查找替换
Jun 13 #PHP
php启用zlib压缩文件的配置方法
Jun 12 #PHP
Window下PHP三种运行方式图文详解
Jun 11 #PHP
You might like
判“新”函数:得到今天与明天的秒数
2006/10/09 PHP
windows下PHP APACHE MYSQ完整配置
2007/01/02 PHP
linux环境apache多端口配置虚拟主机的方法深入介绍
2013/06/09 PHP
php对csv文件的读取,写入,输出下载操作详解
2013/08/10 PHP
php采集自中央气象台范围覆盖全国的天气预报代码实例
2015/01/04 PHP
php处理json格式数据经典案例总结
2016/05/19 PHP
Yii框架中jquery表单验证插件用法示例
2016/10/18 PHP
PHP封装的XML简单操作类完整实例
2017/11/13 PHP
Prototype 学习 工具函数学习($w,$F方法)
2009/07/12 Javascript
jQuery学习4 浏览器的事件模型
2010/02/07 Javascript
5个javascript的数字格式化函数分享
2011/12/07 Javascript
js螺旋动画效果的具体实例
2013/11/15 Javascript
jquery中对于批量deferred的处理方法
2014/01/22 Javascript
javascript:void(0)的问题使用探讨
2014/04/10 Javascript
原生javascript实现拖动元素示例代码
2014/09/01 Javascript
jQuery中inArray方法注意事项分析
2016/01/25 Javascript
Chrome不支持showModalDialog模态对话框和无法返回returnValue问题的解决方法
2016/10/30 Javascript
JS生成一维码(条形码)功能示例
2017/01/19 Javascript
原生js实现类似fullpage的单页/全屏滚动
2017/01/22 Javascript
vue 添加vux的代码讲解
2017/11/30 Javascript
vue-cli webpack2项目打包优化分享
2018/02/07 Javascript
实例分析Array.from(arr)与[...arr]到底有何不同
2019/04/09 Javascript
微信小程序点击列表跳转到对应详情页过程解析
2019/09/26 Javascript
[57:47]Fnatic vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
[06:48]DOTA2-DPC中国联赛2月26日Recap集锦
2021/03/11 DOTA
使用python读取csv文件快速插入数据库的实例
2018/06/21 Python
使用Python的turtle模块画国旗
2019/09/24 Python
Python 实现将数组/矩阵转换成Image类
2020/01/09 Python
Python 中如何写注释
2020/08/28 Python
自然健康的概念:Natural Healthy Concepts
2020/01/26 全球购物
双十佳事迹材料
2014/01/29 职场文书
《维生素c的故事》教学反思
2014/02/18 职场文书
2014离婚协议书范文两篇
2014/09/15 职场文书
2014国庆节餐厅促销活动策划方案
2014/09/16 职场文书
2014七年级班主任工作总结
2014/12/05 职场文书
2019求职信:应届生求职信范文
2019/04/24 职场文书