hprose for php,基于swoole的Hprose for PHP 开发后端API服务 实践

注:Hprose for PHP 已更新到2.0 本文代码已失效 请参阅最新官方文档

https://github.com/hprose/hprose-php/wiki

Hprose(High Performance Remote Object Service Engine)

是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。

你无需专门学习,只需看上几眼,就能用它轻松构建分布式应用系统。

http://hprose.com/

swoole PHP的异步、并行、高性能网络通信引擎

http://www.swoole.com/

简单示例,目标:开发一个后台服务,通过id查询数据库的用户表数据,

当服务器端发布的方法被调用前,通过Hprose提供的onBeforeInvoke函数来验证IP

软件安装:

mariadb 10.1.13

php 5.6.21

swoole 1.8.4

服务端:

目录结构

3f60895c1dd8b3b591e0cab52dac6c3a.png

数据库配置文件:config.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

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() . "
";

}

}

}

服务器文件:server.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();

客户端:

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');

可解决跨域问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值