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文件下载到工作目录下
服务端:
目录结构
数据库配置文件: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');
可解决跨域问题。