zoukankan      html  css  js  c++  java
  • 浅析Thinkphp框架中运用phprpc扩展模式

    浅析Thinkphp框架中应用phprpc扩展模式

    这次的项目舍弃了原来使用Axis2做web服务端的 方案,改用phprpc实现,其一是服务端的thinkphp已集成有该模式接口,其二是phprpc传输的数据流相对于普通WebService中的 XML或JSON形式的数据量明显减少,而且因为数据量的关系解析速度明显比较快~~

    说实话,以前还真不知道有phprpc这个协议的,本打算使用 sina的api的restlet形式开发,但自己写库的话会花比较多的时间,而现在轻量级的php框架支持rest的貌似只有cakephp,对于已经 用tp部署的项目,实在是不情愿,这次偶尔在tp框架官网上徘徊一番~~忽然发现2.1RC版本有个新模式——phprpc。

    用了才知道,phprpc这东西真的不错~~赞一个

    但貌似这东西文档和案例比较的匮乏,而且tp框架也没有相应的 教程和案例来使用这个模式(官方论坛里貌似也没有具体的使用方法http://bbs.thinkphp.cn /search.php?searchid=156&orderby=lastpost&ascdesc=desc& searchsubmit=yes)~~下面是我探索后写下的一些东西~~

    首先认识下phprpc协议,具体文档(http://www.phprpc.org/zh_CN/docs/);

    进入正题:

    一、安装phprpc模式

    1、将phprpc模式的文件夹(在官方SDK下的AddOns中,有一个phprpc文件夹和phprpc.php文件)拷到think核心文件下的mode文件夹中。


    2、将phprpc的php的SDK拷到think核心文件下的Vendor文件夹中(要重命名为phprpc)


    3、在入口文件添加如下代码:

    define('THINK_MODE','PHPRPC'); 

      4、在配置文件中添加如下配置代码:

    'APP_PHPPRC_ACTIONS'=>'Account,Test,Topic,Timeline,User,Favorites,Follow'

     这里的字符串是要发布为服务的Action,可以多个,用逗号隔开

    二、编写Action

    首先来看看这边的phprpc模式到底tp做了什么。以下代码摘自phprpc自带的app.class.php

            Vendor('phpRPC.phprpc_server');
        	//实例化phprpc
        	$server = new PHPRPC_Server();
            $actions =  explode(',',C('APP_PHPPRC_ACTIONS'));
            foreach ($actions as $action){
           	    //$server -> setClass($action.'Action'); 
    			$temp = $action.'Action';
    			$methods = get_class_methods($temp);
    			$server->add($methods,new $temp);
    	}
    	$server->setDebugMode(true);  
    	$server->setEnableGZIP(true);
    	$server->start();

      这里导入了vendor里的phprpc核心类,再对每个在配置文件里要求发布的Action进行遍历,使所有的public方法全部发布。

    在这里(http://bbs.thinkphp.cn /viewthread.php?tid=21593&highlight=phprpc)论坛中提到了在Action中start一个服务端, 这其实是行不通的。上面的就是很好的解释,所以在所有的Action 的方法中只要有参数传入和参数return便可以以phprpc协议发布。

    实例:

    class TestAction extends Action{
    	
    	/**
    	 * 
    	 * 测试欢迎
    	 * @param string $name
    	 */
    	function hello($name) {  
        	return 'Hello ' . $name;  
    	} 
    
    }

    三、关于Model not find的问题

    假使在上述Action中调用M()工厂方法,会出现Model找不到的现象,这个问题搞了我很久,后来被我找到了解决方案在mode文件夹下的phprpc.php文件中加入:

    THINK_PATH.'/Lib/Think/Core/Model.class.php', // 模型类

     这一配置项,对于视图模型找不到的现象的方法也是如此,下面是修改版的phprpc.php文件

    return array(
        THINK_PATH.'/Common/functions.php',   // 系统函数库
        THINK_PATH.'/Lib/Think/Core/Think.class.php',
        THINK_PATH.'/Lib/Think/Exception/ThinkException.class.php',// 异常处理
        THINK_PATH.'/Lib/Think/Core/Log.class.php',// 日志处理
        THINK_PATH.'/Mode/Phprpc/App.class.php', // 应用程序类
        THINK_PATH.'/Mode/Phprpc/Action.class.php',// 控制器类
        THINK_PATH.'/Lib/Think/Core/Model.class.php', // 模型类
        THINK_PATH.'/Lib/Think/Core/Model/ViewModel.class.php', // 视图模型类
        THINK_PATH.'/Mode/Phprpc/alias.php', // 加载别名
    );

    四、关于Action方法返回问题

    返回参数统一都是用return;

    返回字符串可以用echo;

    返回异常可以直接抛出异常throw new Exception('string', 1);

  • 相关阅读:
    HDU 1525
    kmp模板
    hdu 4616 Game(树形DP)
    hdu 4619 Warm up 2(并查集活用)
    hdu 4614 Vases and Flowers(线段树加二分查找)
    Codeforces 400D Dima and Bacteria(并查集最短路)
    poj 2823 Sliding Window (单调队列)
    hdu 2196 Computer(树形dp)
    hdu 4604 Deque
    最短路径
  • 原文地址:https://www.cnblogs.com/aipiaoborensheng/p/4884964.html
Copyright © 2011-2022 走看看