PHP远程调用以及RPC框架

admin3年前PHP教程33
目录
前言分模块分项目CURLRPCYarThriftSOAPJSON-RPC项目拆分带来的变化项目细化人员需求文档后记
前言

一个项目,从开始到版本更新,一直到最后的版本维护。功能在不断增多,对应的代码量也在不断增加,也就意味着项目变得更不可维护,这时候,我们需要用拆分的方式将一个项目打散,以便开发团队更好的对项目进行维护。

分模块

这个阶段,一般也是项目的初级阶段,由于人手不够,一个服务端的接口项目只有一个开发进行维护,根据开发的习惯,会把项目分成若干个模块进行开发,在一个项目下进行部署。

这样做的缺点在于项目会随着版本更新而变得不可维护。

分项目

随着每个模块功能的不断完善,代码变得更加臃肿。这时候需要对项目进行拆分,比如上面的图,分成用户体系项目、支付体系项目。

CURL

开始大家会采用CURL的方式对外部资源进行访问。

比如某短信平台SDK,比如各大第三方提供的SDK,纠结到源码发现都是直接采用CURL函数的方式进行访问。

优点在于没有环境要求,能直接用。
缺点在于并发访问的资源占用问题。


//新浪微博SDK的http请求部分源码
 /**
     * Make an HTTP request
     *
     * @return string API results
     * @ignore
     */
    function http($url, $method, $postfields = NULL, $headers = array()) {
        $this->http_info = array();
        $ci = curl_init();
        /* Curl settings */
        curl_setopt($ci, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
        curl_setopt($ci, CURLOPT_USERAGENT, $this->useragent);
        curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, $this->connecttimeout);
        curl_setopt($ci, CURLOPT_TIMEOUT, $this->timeout);
        curl_setopt($ci, CURLOPT_RETURNTRANSFER, TRUE);
        curl_setopt($ci, CURLOPT_ENCODING, "");
        curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, $this->ssl_verifypeer);
        if (version_compare(phpversion(), '5.4.0', '<')) {
            curl_setopt($ci, CURLOPT_SSL_VERIFYHOST, 1);
        } else {
            curl_setopt($ci, CURLOPT_SSL_VERIFYHOST, 2);
        }
        curl_setopt($ci, CURLOPT_HEADERFUNCTION, array($this, 'getHeader'));
        curl_setopt($ci, CURLOPT_HEADER, FALSE);
 
        switch ($method) {
            case 'POST':
                curl_setopt($ci, CURLOPT_POST, TRUE);
                if (!empty($postfields)) {
                    curl_setopt($ci, CURLOPT_POSTFIELDS, $postfields);
                    $this->postdata = $postfields;
                }
                break;
            case 'DELETE':
                curl_setopt($ci, CURLOPT_CUSTOMREQUEST, 'DELETE');
                if (!empty($postfields)) {
                    $url = "{$url}?{$postfields}";
                }
        }
 
        if ( isset($this->access_token) && $this->access_token )
            $headers[] = "Authorization: OAuth2 ".$this->access_token;
 
        if ( !empty($this->remote_ip) ) {
            if ( defined('SAE_ACCESSKEY') ) {
                $headers[] = "SaeRemoteIP: " . $this->remote_ip;
            } else {
                $headers[] = "API-RemoteIP: " . $this->remote_ip;
            }
        } else {
            if ( !defined('SAE_ACCESSKEY') ) {
//                $headers[] = "API-RemoteIP: " . $_SERVER['REMOTE_ADDR'];
            }
        }
        curl_setopt($ci, CURLOPT_URL, $url );
        curl_setopt($ci, CURLOPT_HTTPHEADER, $headers );
        curl_setopt($ci, CURLINFO_HEADER_OUT, TRUE );
 
        $response = curl_exec($ci);
        $this->http_code = curl_getinfo($ci, CURLINFO_HTTP_CODE);
        $this->http_info = array_merge($this->http_info, curl_getinfo($ci));
        $this->url = $url;
 
        if ($this->debug) {
            echo "=====post data======\r\n";
            var_dump($postfields);
 
            echo "=====headers======\r\n";
            print_r($headers);
 
            echo '=====request info====='."\r\n";
            print_r( curl_getinfo($ci) );
 
            echo '=====response====='."\r\n";
            print_r( $response );
        }
        curl_close ($ci);
        return $response;
    }
RPC

远程过程调用协议

RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。

RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。

Yar

鸟哥出品的RPC框架,轻量级框架。


<?php
class API {
    /**
     * the doc info will be generated automatically into service info page.
     * @params
     * @return
     */
    public function api($parameter, $option = "foo") {
    }
 
    protected function client_can_not_see() {
    }
}
 
$service = new Yar_Server(new API());
$service->handle();
?>

调用代码


<?php
$client = new Yar_Client("host/api/");
$result = $client->api("parameter);
?>

注意的是鸟哥出的东西文档比较少,需要多调试。

Thrift

thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 这些编程语言间无缝结合的、高效的服务。

远程调用的意义在于,不同的子项目可以用更适合自己的语言来解决,更有效率的实现需求。

同时,对团队的开发来讲,更能提高整体的技术水平。

SOAP

由于用的XML就不多描述了,毕竟还是json用的多。

JSON-RPC

下面是返回值的标准

--> [

    {"jsonrpc": "2.0", "method": "sum", "params": [1,2,4], "id": "1"},

    {"jsonrpc": "2.0", "method": "notify_hello", "params": [7]},

    {"jsonrpc": "2.0", "method": "subtract", "params": [42,23], "id": "2"},

    {"foo": "boo"},

    {"jsonrpc": "2.0", "method": "foo.get", "params": {"name": "myself"}, "id": "5"},

    {"jsonrpc": "2.0", "method": "get_data", "id": "9"} 

    ]

<-- [

    {"jsonrpc": "2.0", "result": 7, "id": "1"},

    {"jsonrpc": "2.0", "result": 19, "id": "2"},

    {"jsonrpc": "2.0", "error": {"code": -32600, "message": "Invalid Request"}, "id": null},

    {"jsonrpc": "2.0", "error": {"code": -32601, "message": "Method not found"}, "id": "5"},

    {"jsonrpc": "2.0", "result": ["hello", 5], "id": "9"}

    ]

实际上你会发现我们在给客户端提供接口的返回值,就是按照这个标准来做的。

相应的,服务端对服务端的数据接收和返回,也要同样按照这个标准来做。

项目拆分带来的变化

项目细化

一个模块对应一个项目,项目之间通过基于REST的接口标准进行面向资源的数据访问。

人员需求

项目拆分的前提是一个项目不足以满足现有的业务发展要求,也就意味着拆分之后的开发人员数量的扩增。

游击队向正规军编制的跨越!

文档

更多的项目也就意味着更多的接口调用文档,适当的处理文档才能更好的提高团队协作效率。

后记

服务的远程调用在于怎么合理的把一个正在变得不可维护的项目从焦油坑中解救出来,并提高项目整体能承载的业务量,不过,世界上没有银弹。

以上就是PHP远程调用以及RPC框架的详细内容,更多关于PHP远程调用的资料请关注其它相关文章!

免责声明:本文内容来自用户上传并发布,站点仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。请核实广告和内容真实性,谨慎使用。

相关文章

在PHP中灵活使用foreach+list处理多维数组的方法

先抛出问题,有时候我们接收到的参数是多维数组,我们需要将他们转成普通的数组,比如:$arr = [  [1, 2, [3, 4]],  [5, 6, [7, 8...

东莞高防服务器租用应该怎么选择

东莞高防服务器租用应该怎么选择?选择东莞高防服务器租用时,以下几个因素需要考虑:防护能力:高防服务器主要是为了防止各种网络攻击,包括DDoS攻击、CC攻击、UDP攻击等等。因此,在选择时需要注意服务器...

PHP实现JWT的Token登录认证

1、JWT简介JSON Web Token(缩写 JWT),是目前最流行的跨域认证解决方案。session登录认证方案:用户从客户端传递用户名、密码等信息,服务端认证后将信息存储在session中,将...

适合TikTok直播的跨境直播网络专线在这里

适合TikTok直播的跨境直播网络专线在这里!TikTok已经成为全球非常流行的短视频应用。除了facebook\twitter等国外本地应用,TikTok已成功成为出海的标杆产品之一。是年轻一代冲浪...

HTTP中header头部信息详解

HTTP Request的Header信息1、HTTP请求方式如下表:GET向Web服务器请求一个文件POST向Web服务器发送数据让Web服务器进行处理PUT向Web服务器发送数据并存储在Web服务...

php字符串中转义成特殊字符实例讲解

在php的字符串使用时,我们有学会一些转义字符,相信大家在记忆这些知识点的时候费了不少的功夫。本篇我们为大家带来的是字符串的转义方法,涉及到特殊字符的使用,主要有两种方法可以实现:mysql库函数和转...