文章来自于:http://blog.csdn.net/half1/article/details/21252879

本文将介绍Hprose for php服务器的更多细节

1、发布服务

Hprose提供多种方法发布服务,除了提供跟PHPRPC中相同的add方法以外,还提供了更多方便的方法。
写完服务器后访问之,如果会出现类似“Fa1{s5"hello"}z的字符串就说明服务器没问题。

a)发布函数

大部分函数可以作为Hprose服务发布,甚至包括PHP中的内置的函数。但如果参数或结果中包含有资源类型(比如mysql_connect,mysql_query等),那么这种函数就不能够发布。(也就是说如果Hprose无法传递的数据类型的函数就不行,个人猜测)
你可以同时发布多个函数,不论是你自定义的,还是PHP内置的都可以。把函数名放到数组中用addFunctions一次添加多个。
  1. <?php
  2. include("hprose/hproseHttpServer.php");
  3. $server = new HproseHttpServer();
  4. $server->addFunction("trim");
  5. $server->addFunctions(array('md5', 'sha1'));
  6. $server->handle();
  7. ?>

b)发布方法

Hprosefor PHP 也支持发布类的静态方法和对象的实例方法。
注意:php中方法与函数的区别:方法指的是类中的函数。
  1. <?php
  2. include("hprose/hproseHttpServer.php");
  3. class Example1 {
  4. static function foo() {
  5. return 'foo';
  6. }
  7. function bar() {
  8. return 'bar';
  9. }
  10. }
  11. $server = new HproseHttpServer();
  12. $server->addMethod('foo', 'Example1');
  13. $server->addMethod('bar', new Example1());
  14. $server->handle();
  15. ?>

这里foo是一个静态方法,所以添加时第二个参数是类名。而bar是一个实例方法,所以添加时是一个Example1的实例对象。

c)别名机制

当在服务器中同时发布两个不同类中的同名方法时,是否会有冲突?
答案是会,后添加的方法会将前面添加的方法覆盖掉。于是Hprose提供了一种别名机制。
  1. <?php
  2. include("hprose/hproseHttpServer.php");
  3. function hello($name) {
  4. return 'Hello ' . $name;
  5. }
  6. class Example1 {
  7. static function foo() {
  8. return 'foo';
  9. }
  10. function bar() {
  11. return 'bar';
  12. }
  13. }
  14. class Example2 {
  15. function foo() {
  16. return 'foo, too';
  17. }
  18. function bar() {
  19. return 'bar, too';
  20. }
  21. }
  22. $server = new HproseHttpServer();
  23. $server->addFunction('hello', 'hi');
  24. $server->addMethod('foo', 'Example1', 'ex1_foo');
  25. $server->addMethod('bar', new Example1(), 'ex1_bar');
  26. $server->addMethods(array('foo', 'bar'), new Example2(), array('ex2_foo', 'ex2_bar'));
  27. $server->handle();
  28. ?>

从上面这个例子,我们就会发现不论是函数还是方法都可以通过别名来发布,只需要在最后再加一个别名参数就可以了。同时添加多个方法(或函数)时,别名也应该是多个,并且个数要跟方法(或函数)名个数相同,且一一对应。

最后要注意的一点是,通过别名发布的方法(或函数)在调用时如果用原方法(或函数)名调用是调用不到的,也就是说只能用别名来调用。

 

d)发布对象

除了向上面通过addMethod和addMethods发布方法以外,Hprose可以让您更方便的发布一个对象上的方法,那就是使用addInstanceMethods,addInstanceMethods用来发布指定对象上的指定类层次上声明的所有public实例方法。它有三个参数,其中后两个是可选参数。如果您在使用addInstanceMethods方法时,不指定类层次(或者指定为NULL),则发布这个对象所在类上声明的所有public实例方法。这个方法也支持指定名称空间(别名前缀)。
  1. <?php
  2. include("hprose/hproseHttpServer.php");
  3. class Example2 {
  4. function foo() {
  5. return 'foo, too';
  6. }
  7. function bar() {
  8. return 'bar, too';
  9. }
  10. }
  11. $server = new HproseHttpServer();
  12. $server->addInstanceMethods(new Example2(), NULL, 'ex2');
  13. $server->handle();
  14. ?>

效果是跟上面别名机制例子中发布ex2_foo和ex2_bar方法一样的。

e)发布类

跟addInstanceMethods方法类似,使用addClassMethods可以让您更方便的发布一个类上的方法。它有三个参数,其中后两个是可选参数。第一个参数是方法的发布类,第二个参数为方法的执行类,第三个参数为名称空间(别名前缀)。

 

f)迷失的方法

当客户端调用一个服务器端没有发布的方法时,默认情况下,服务器端会抛出错误。但是如果你希望能对客户端调用的不存在的方法在服务器端做特殊处理的话,你可以通过addMissingFunction方法来实现。

这是一个很有意思的方法,它用来发布一个特定的方法,当客户端调用的方法在服务器发布的方法中没有查找到时,将调用这个特定的方法。

使用addMissingFunction发布的方法可以是实例方法、静态方法或者函数,但是只能发布一个。如果多次调用addMissingFunction方法,将只有最后一次发布的有效。

用addMissingFunction发布的方法参数应该为两个:

第一个参数表示客户端调用时指定的方法名,方法名在传入该方法时全部是小写的。

第二个参数表示客户端调用时传入的参数列表。例如客户端如果传入两个参数,则 args 的列表长度为2,客户端的第一个参数为 args 的第一个元素,第二个参数为 args 的第二个元素。如果客户端调用的方法没有参数,则 args为长度为0 的列表。

除了可直接使用addMissingFunction来处理迷失的方法以外,你还可以通过addFunction或addMethod发布一个别名为星号(*)的方法。效果是一样的。

2、服务器开关

a)隐藏发布列表

发布列表的作用相当于Web Service的WSDL,与WSDL不同的是,Hprose的发布列表仅包含方法名,而不包含方法参数列表,返回结果类型,调用接口描述,数据类型描述等信息。

如果您不希望用户直接通过浏览器就可以查看发布列表的话,您可以禁止服务器接收GET请求。方法很简单,只需要在调用handle方法之前调用setGetEnabled方法,将参数设置为false即可。

  1. $server->setGetEnabled=false;

b)调试开关

  1. $server->setDebugEnabled=true; //打开调试

c)P3P开关

在Hprose的http服务中还有一个P3P开关,这个开关决定是否发送P3P的http头,这个头的作用是让IE允许跨域接收的Cookie。当您的服务需要在浏览器中被跨域调用,并且希望传递Cookie时(例如通过Cookie来传递Session ID),您可以考虑将这个开关打开。否则,无需开启此开关。此开关默认是关闭状态。开启方法与上面的开关类似,只需要在调用handle方法之前调用setP3PEnabled方法,将参数设置为true即可。

d)跨越开关

Hprose 支持 JavaScript、ActionScript 和 SilverLight 客户端的跨域调用,对于 JavaScript 客户端来说,服务器提供了两种跨域方案,一种是 W3C标准跨域方案,这个只需要在服务器端调用handle方法之前调用setCrossDomainEnabled方法,将参数设置为true即可。当你在使用Hprose专业版提供的服务测试工具Nepenthes(忘忧草)时,一定要注意必须要打开此开关才能正确进行调试,否则Nepenthes将报告错误的服务器。

另一种跨域方案同时适用于以上三种客户端,那就是通过设置跨域策略文件的方式。这个只需要将crossdomain.xml放在服务器发布的根目录上即可。

对于SilverLight客户端来说,还支持clientaccesspolicy.xml 这个客户端访问策略文件,它的设置方法跟crossdomain.xml是一样的,都是放在服务器发布的根目录上。

关于crossdomain.xml 和clientaccesspolicy.xml 的更多内容请参阅:

http://www.adobe.com/devnet/articles/crossdomain_policy_file_spec.html

http://www.adobe.com/devnet/flashplayer/articles/fplayer9_security.html

http://msdn.microsoft.com/en-us/library/cc197955%28v=VS.95%29.aspx

http://msdn.microsoft.com/en-us/library/cc838250%28v=VS.95%29.aspx

3、服务器事件

 

也许您可能还希望设置其它的http头,或者希望在发生错误时,能够在服务器端进行日志记录。甚至希望在调用发生的前后可以做一些权限检查或日志记录等。在Hprose中,这些都可以轻松做到。Hprose提供了这样的事件机制。

Hprose服务器提供了四个事件,它们分别是onBeforeInvoke、onAfterInvoke、onSendHeader和onSendError。下面我们就来对这四个事件分别做一下介绍。

a)onBeforeInvoke事件

当服务器端发布的方法被调用前,onBeforeInvoke事件被触发,它有三个参数,他们从左到右的顺序分别是name,args和byRef。其中name为客户端所调用的方法名,args为方法的参数,byRef表示是否是引用参数传递的调用。

您可以在该事件中做用户身份验证,例如IP验证。也可以作日志记录。如果在该事件中想终止调用,抛出异常即可。

b)onAfterInvoke事件

当服务器端发布的方法被成功调用后,onAfterInvoke事件被触发,其中前三个参数与onBeforeInvoke事件一致,最后一个参数result表示调用结果。

当调用发生错误时,onAfterInvoke事件将不会被触发。如果在该事件中抛出异常,则调用结果不会被返回,客户端将收到此事件抛出的异常。

c)onSendHeader事件

当服务器返回响应头部时,onSendHeader事件会被触发,该事件无参数。

在该事件中,您可以发送您自己的头信息,例如设置Cookie。该事件中不应抛出任何异常。

d)onSendError事件

当服务器端调用发生错误,或者在onBeforeInvoke、onAfterInvoke事件中抛出异常时,该事件被触发,该事件只有一个参数error。

您可以在该事件中作日志记录,但该事件中不应再抛出任何异常。

转:Hprose for php(二)——服务器的更多相关文章

  1. WebChart网页局域网聊天系列(二):服务器结构及核心代码

    public partial class MainForm : Form { private Socket server;//服务器Socket private int userNum;//当前在线用 ...

  2. Asp .Net Core Spa (二) - 服务器渲染1

    Server Side Rendering 服务器渲染是各 Spa 项目目前很热衷于解决的一个问题,毕竟针对SEO和首次加载优化 .Net Core SPA 服务器渲染 将分为 两篇: 第一篇 主要分 ...

  3. 2.node.js (二)服务器登录注册 与 包的发布

    get: 不安全 小 2k 数据会在地址栏上显示 从服务器获取 快 post: 相对安全 https 大 1G 不会 向服务器发送 慢 get:直接解析url地址 借助 url模块 var urlOb ...

  4. [从零开始搭网站二]服务器环境配置:Mac电脑连接CentOS不用每次都输入密码

    上一篇讲了如何购买服务器,并且***.看这里的第一篇文章: 从零开始搭网站 从这里开始的文章,我会默认大家都是最起码是入门级的程序员,如果你完全不懂我在说什么,那就退出好了. 作为开发人员,接下来为了 ...

  5. Python实现简单HTTP服务器(二)

    实现简单web框架 一.框架(MyWeb.py) # coding:utf-8 import time # 设置静态文件根目录 HTML_ROOT_DIR = "./html" c ...

  6. Android上传图片到服务器

    一.android需要导入异步请求的jar包 AsyncHttpClient  public static void reg(final Context cont,Bitmap photodata,S ...

  7. 最准确的单点登录SSO图示和讲解(有代码范例)|手把手教做单点登录(SSO)系列之二

    写第一篇博客<手把手教做单点登录(SSO)系列之一:概述与示例>,就获得了园子里朋友们热情的评论和推荐,感谢各位. 我那篇文章同时发了CSDN和博客园.对比一下,更感受到博客园童鞋们的技术 ...

  8. javaWeb,web服务器

    一. 1.ASP 国内最早最流行的语言就是ASP:微软研发 在HTML中嵌套了VB脚本,ASP+COM(网页元素) 在ASP开发中,基本一个业务就有几千行代码,页面机器混乱 维护成本高 <h1& ...

  9. DWR实现扫一扫登录功能

    前言 <DWR实现后台推送消息到Web页面>一文中已对DWR作了简介,并列出了集成步骤.本文中再一次使用到DWR,用以实现扫一扫登录功能. 业务场景 web端首页点击"登陆&qu ...

随机推荐

  1. RabbitMQ-死信(Dead Letter)

    对于有异常的消息我们可以有如下做法: 记录下来再ack. nack或者reject,同时将requeue设为false. 在第2条的基础上增加死信(Dead Letter).   上边的第3个做法可以 ...

  2. dubbo服务+Spring事务+AOP动态数据源切换 出错

    1:问题描述,以及分析 项目用了spring数据源动态切换,服务用的是dubbo.在运行一段时间后程序异常,更新操作没有切换到主库上. 这个问题在先调用读操作后再调用写操作会出现. 经日志分析原因: ...

  3. Django之牛刀初试

    一.Django安装 1.使用pip安装django pip3 inistall django 2.将django-admin加入到环境变量中 # 如果是windows的系统需要操作这一步,linux ...

  4. Android的TextView与Html相结合的用法

    Android中的TextView,本身就支持部分的Html格式标签.这其中包括常用的字体大小颜色设置,文本链接等.使用起来也比较方便,只需要使用Html类转换一下即可.比如: textView.se ...

  5. "org.eclipse.wst.validation" has been removed

    导出maven工程遇到的问题,"org.eclipse.wst.validation" has been removed,还以为是工程本身的问题,后来发现是eclipse的问题. ...

  6. 关于lucene的IndexSearcher单实例,对于索引的实时搜索

    Lucene版本:3.0 一般情况下,lucene的IndexSearcher都要写成单实例,因为每次创建IndexSearcher对象的时候,它都需要把索引文件加载进来,如果访问量比较大,而索引也比 ...

  7. android抓包工具

    下载 http://gdown.baidu.com/data/wisegame/2158469c63492e89/Tcpzhuabao_2.apk

  8. ie11只能用管理员身份打开解决办法

    解决IE11只能用管理员身份运行的问题 不知道大家有没有遇到这种情况,在毫不知情的情况下 IE11 突然打不开了,必须要用管理员身份运行才可以打开,而且重置浏览器这个方法也不奏效. 今天本人也遇到了, ...

  9. 一些Linux优化方法

    1. 利用栈做备胎,减少分配空间的几率,IO自己有一份缓存,如果超了就使用stack空间 2. 分散IO:代表readv,可以通过一次系统调用,将内容读到分散的缓存中,可以减少系统的系统调用

  10. [转] 关于c++的头文件依赖

    http://www.cnblogs.com/yvesliao/p/3938730.html PS: 使用单向依赖 正在看google c++编程规范,里面对头文件依赖是这么说的: 1 2 3 4 5 ...