注:Hprose for PHP 已更新到2.0 本文代码已失效 请参阅最新官方文档
https://github.com/hprose/hprose-php/wiki


Hprose(High Performance Remote Object Service Engine)
是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。
你无需专门学习,只需看上几眼,就能用它轻松构建分布式应用系统。
http://hprose.com/

Hprose for PHP
https://github.com/hprose/hprose-php

swoole PHP的异步、并行、高性能网络通信引擎
http://www.swoole.com/

简单示例,目标:开发一个后台服务,通过id查询数据库的用户表数据,
当服务器端发布的方法被调用前,通过Hprose提供的onBeforeInvoke函数来验证IP

软件安装:
mariadb 10.1.13
php 5.6.21
swoole 1.8.4

https://github.com/hprose/hprose-php/tree/master/src
hprose文件下载到工作目录下

服务端:
目录结构
QQ图片20160524142310.png

数据库配置文件:config.php

<?php
/**
 *  数据库连接配置
 */
define('DB_NAME', 'xxx');
define('DB_USER', 'xxx');
define('DB_PWD', 'xxx');
define('DB_HOST', '127.0.0.1');
define('DB_PORT','3306');
define('DB_TYPE','mysql');
define('DB_CHARSET','utf8');
define('PAGINATE_LIMIT', '5');
define('PREFIX', '');

User类文件:User.php

<?php
class User {
    
    public function getUserByID($user_id) {
        
        try {

            $dbh = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME, DB_USER, DB_PWD);

            $rs = array();
            
            foreach($dbh->query("SELECT * from XXXX WHERE `id` = {$user_id}") as $row) {
                $rs[] = $row;
            }
            
            return $rs;

        } catch (PDOException $e) {
            return "Error!: " . $e->getMessage() . "<br/>";
        }
    }
}

服务器文件:server.php

<?php
/**
 *  配置文件    
 */
require_once("config.php");

/**
 *  引入Hprose
 */
require_once("Hprose.php");

/**
 *  autoload加载,将文件都放在classes目录下
 */
spl_autoload_register(function ($class) {
    include 'classes/' . $class . '.php';
});

/**
 *  使用 HproseSwooleServer 来创建一个独立的 hprose 服务
 *  绑定8080端口
 */
$server = new HproseSwooleServer('http://0.0.0.0:8080/');

/**
 *  addInstanceMethods用来发布指定对象上的指定类层次上声明的所有public实例方法
 *  它有三个参数,其中后两个是可选参数。
 *  如果您在使用addInstanceMethods方法时,不指定类层次(或者指定为NULL),则发布这个对象所在类上声明的所有public实例方法
 *  设置别名为my
 */
$server->addInstanceMethods(new User(), NULL, 'my');

/**
 *  onBeforeInvoke 会在接口被调用前执行
 *  因此可以用来验证IP
  */
$server->onBeforeInvoke = function ($name, $args, $byref, $context) {
    if($context->request->server['remote_addr'] == '127.0.0.1') {

    } else {
        //不是正确的IP则抛出异常,终止服务
        throw new Exception("unknow client IP");    
    }
};

//启动服务
$server->start();

客户端:

<?php
require_once("Hprose.php");
$client = new HproseSwooleClient('http://localhost:8080');
//调用getUserByID方法,需要加上设置的别名my_
print_r($client->my_getUserByID(4003));

直接打印出了数据,则走通了整个流程。

Hprose for HTML5客户端调用跨域问题

用Hprose for HTML5的客户端调用,发现不能跨域,
查源码,发现Hprose提供了解决办法,server.php启动服务前加上以下语句,
允许跨域,并将调用的域名加入AccessControlAllowOrigin

$server->setCrossDomainEnabled();
$server->addAccessControlAllowOrigin('http://xxxxxxxxxx');

可解决跨域问题。