当前位置:首页 > PHP > 正文内容

xmlrpc php,php通过xml-rpc进行通信

高老师7年前 (2019-01-19)PHP1775

xmlrpc协议是通过http请求xml数据进行通信。webservice中和它相同的是soap。soap调用的确很简单,但是创建wsdl太繁琐,效率低下。xmlrpc很好的解决这个问题。

(1).创建xmlrpc服务端(求和函数api)

function getSum($method,$args,$extra)
{
    return array_sum($args);
}

//创建RPC服务
$server = xmlrpc_server_create();

//注册RPC服务支持的函数
xmlrpc_server_register_method($server, 'getSum', 'getSum');

//获取客户端POST原始请求内容
//$request = $HTTP_RAW_POST_DATA;
$request = file_get_contents('php://input');

//执行调用客户端的XML请求获取执行结果
$xmlrpc_response = xmlrpc_server_call_method($server, $request, null);

//定义XML的Header头部
header('content-type:text/xml');

//输出XML
echo $xmlrpc_response;

//销毁资源句柄
xmlrpc_server_destroy($server);

(2).创建xmlrpc客户端调用

class RpcClient
{
    /**
     * RPC服务地址
     * @var string
     */
    protected $url;

    public function __construct($url)
    {
        $this->url = $url;
    }

    protected function __query($request)
    {
        //创建请求上下文
        $context = stream_context_create([
            'http' => [
                'method' => 'post',
                'header' => 'content-type:text/xml',
                'content' => $request
            ]
        ]);

        //请求RPC服务器
        $response = file_get_contents($this->url, false, $context);
        if ($response != false)
        {
            $response = xmlrpc_decode($response);
        }
        return $response;
    }

    public function __call($name, $arguments)
    {
        $request = xmlrpc_encode_request($name, $arguments);
        return $this->__query($request);
    }
}


$url = 'http://learn.cn/server.php';
$client = new RpcClient($url);

$result  = $client->getSum(2);

var_dump($result);

提示:服务端创建完成后可以直接使用xmlrpc_encode_request生成xml进行post数据即可,这里只是对客户端请求封装了一下,另外服务器端的函数一定要标注3个参数,第一个参数一定是函数名,第二个参数是请求数组

扫描二维码推送至手机访问。

版权声明:本文由高久峰个人博客发布,如需转载请注明出处。

本文链接:https://blog.20230611.cn/post/74.html

分享给朋友:

“xmlrpc php,php通过xml-rpc进行通信” 的相关文章

 php 判断是否post,php判断是否post提交,php 判断是否为post,php 判断get 还是post

php 判断是否post,php判断是否post提交,php 判断是否为post,php 判断get 还是post

if($_SERVER['REQUEST_METHOD'] == 'POST') { echo('This is  post '); } elseif ($_SERVER['...

 php xml字符串转数组,phpxml转数组,php 将xml转换成数组

php xml字符串转数组,phpxml转数组,php 将xml转换成数组

001源码:/*  * $xml_str是xml字符串  */ function  xmltoarray($xml_str) { //禁止XML实体扩展攻击 libxml_disable_entity_loader(true); //拒绝包含...

【二】PHP多进程学习-进程信号管理

【二】PHP多进程学习-进程信号管理

(1).学习目标:    了解常见信号类型(百度PHP支持的信号类型),(2).相关函数学习:    (2.1).pcntl_signal函数用于设置一个信号管理器接收进程信号,参数1:信号类型,参数2:回调函数,用于在接收到参数1类型的信...

php new class

php new class

<?php $member = new class {     public function getInfo()     {    ...

PHP Startup: Unable to load dynamic library 'C:\php\ext\php_curl.dll找不到指定的模块

PHP Startup: Unable to load dynamic library 'C:\php\ext\php_curl.dll找不到指定的模块

最近在编写windows php多线程的东西,从官网下载了PHP的线程安全版,尝试开启curl扩展extension=php_curl.dllphp -m 却提示 PHP Startup: Unable to load dynamic library 'C:\php\ext\php_curl...

tp orm事务提交未执行的教训和总结

tp orm事务提交未执行的教训和总结

最近在项目中处理一个关于商品数据重复需要删除多余的商品记录,但是删除一条商品必然要把关联的其他表商品的id和其他商品信息更换为正确的,删除一个商品记录,同时要去修改100多张表的关联商品数据,在项目中引用了tp orm 1.2版本,由于项目是php5.6版本,没法使用最新orm,在代码中每处理1个商...