首页 » PHP教程 » 鸟哥php源码技巧_PHP探秘我与鸟哥 Yar 的亲密接触

鸟哥php源码技巧_PHP探秘我与鸟哥 Yar 的亲密接触

访客 2024-11-02 0

扫一扫用手机浏览

文章目录 [+]

揭开 Yar 神秘面纱

RPC 采取客户端/做事器模式。
首先,客户机调用进程发送一个有进程参数的调用信息到做事进程,然后等待应答信息。
在做事器端,进程保持就寝状态直到调用信息的到达为止。
当一个调用信息到达,做事器得到进程参数,打算结果,发送答复信息,然后等待下一个调用信息,末了,客户端调用进程吸收答复信息,得到进程结果,然后调用实行连续进行。

鸟哥php源码技巧_PHP探秘我与鸟哥 Yar 的亲密接触

这和我们外网 api 的事理不都一个样么?那么我们一起看看高大上的 Yar 是怎么在玩。

鸟哥php源码技巧_PHP探秘我与鸟哥 Yar 的亲密接触
(图片来自网络侵删)

Yar 功能演示

客户端代码,假设该做事设在局域网10.211.55.4

<?php

class RpcClient {

// RPC 做事地址映射表

public static $rpcConfig = array( \"大众RewardScoreService\"大众 => \"大众http://10.211.55.4/yar/server/RewardScoreService.class.php\"大众,

);

public static function init($server){

if (array_key_exists($server, self::$rpcConfig)) { $uri = self::$rpcConfig[$server];

return new Yar_Client($uri);

}

}

}$RewardScoreService = RpcClient::init(\"大众RewardScoreService\"大众);

var_dump($RewardScoreService->support(1, 2));

做事器端代码

<?php

class RewardScoreService {

/

$uid 给 $feedId 点赞

@param $feedId interge

@param $uid interge

@return void

/

public function support($uid,$feedId){

return \"大众uid = \"大众.$uid.\"大众, feedId = \"大众.$feedId;

}

}$yar_server = new Yar_server(new RewardScoreService());$yar_server->handle();

访问结果如下

uid = 1, feedId = 2

Yar 远程调用的实现事理

实际呢,yar client 是通过__call这个魔术方法来实现远程调用的,在Yar_client类里面并没有任何方法,当我们在调用一个不存在的办法的时候,就会实行__call方法,这个在框架中非常常见。

Yar 协议剖析

在 yar 中规定的传输协议如下图所示,要求体为82个字节的yar_header_t和8字节的打包名称和要求实体yar_request_t,在yar_header_t里面用body_len记录8字节的打包名称+要求实体的长度;返回体类似,只是实体内容的构造体轻微不同,在reval里面才是实际末了客户端须要的结果。

全体传输以二进制流的形式传送。

Yar 数据传输的整体流程剖析

yar_transport.h中,定义了yar_transport_t构造体,先不考虑并行处理的接口,以socket传输协议为例子学习,代码简化一些如下:

typedef struct _yar_transport_interface { void data; int (open)(struct _yar_transport_interface self, char address, uint len, long options, char msg TSRMLS_DC); int (send)(struct _yar_transport_interface self, struct _yar_request request, char msg TSRMLS_DC); struct _yar_response (exec)(struct _yar_transport_interface self, struct _yar_request request TSRMLS_DC); int (setopt)(struct _yar_transport_interface self, long type, void value, void addition TSRMLS_DC); int (calldata)(struct _yar_transport_interface self, yar_call_data_t calldata TSRMLS_DC); void (close)(struct _yar_transport_interface self TSRMLS_DC);

} yar_transport_interface_t;typedef struct _yar_transport { const char name; struct _yar_transport_interface (init)(TSRMLS_D); void (destroy)(yar_transport_interface_t self TSRMLS_DC);

yar_transport_multi_t multi;

} yar_transport_t;

然后在transports/socket.c中定义了yar_transport_socket

yar_transport_t yar_transport_socket = { \公众sock\公众,

php_yar_socket_init,

php_yar_socket_destroy,

};

整理了整体的实行流程如下图

Yar 数据的打包和解包

鸟哥在yar_packager.c中首先定义了一个构造体,初始化的时候会把各个yar_packager_t注册到packagers数组中。

struct _yar_packagers_list { unsigned int size; unsigned int num; yar_packager_t packagers;

} yar_packagers_list;

typedef struct _yar_packager {

const char name;

int (pack) (struct _yar_packager self, zval pzval, smart_str buf, char msg TSRMLS_DC);

zval (unpack) (struct _yar_packager self, char content, size_t len, char msg TSRMLS_DC);

} yar_packager_t;

然后通过传入的nameyar_packager_tname做比较,相同则返回该实例

PHP_YAR_API yar_packager_t php_yar_packager_get(char name, int nlen TSRMLS_DC) / {{{ / { int i = 0; for (;i<yar_packagers_list.num;i++) { if (strncasecmp(yar_packagers_list.packagers[i]->name, name, nlen) == 0) { return yar_packagers_list.packagers[i];

}

} return NULL;

} / }}} /

亲密打仗完毕。
纸上得来终觉浅,绝知此事要躬行。
这篇博客只能是赞助大家在看源码时一起剖析,以为不能抛开源码仅仅看这篇博客。

怎么样才能对这个内容真正的节制呢,以是我有折腾了一个Java 版本的客户端,这样总算有所收成,这份代码也和我们平常写的业务逻辑还是有些差异,二进制的东西居多,全体过程下来对网络数据的传输有了更深刻的理解和学习哈。

Github 项目地址: https://github.com/zhoumengkang/yar-java-client

标签:

相关文章

执业药师试卷代码解码药师职业发展之路

执业药师在药品质量管理、用药安全等方面发挥着越来越重要的作用。而执业药师考试,作为进入药师行业的重要门槛,其试卷代码更是成为了药师...

PHP教程 2025-02-18 阅读1 评论0

心灵代码主题曲唤醒灵魂深处的共鸣

音乐,作为一种独特的艺术形式,自古以来就承载着人类情感的表达与传递。心灵代码主题曲,以其独特的旋律和歌词,唤醒了无数人的灵魂深处,...

PHP教程 2025-02-18 阅读0 评论0

探寻福建各市车牌代码背后的文化内涵

福建省,地处我国东南沿海,拥有悠久的历史和丰富的文化底蕴。在这片充满魅力的土地上,诞生了许多具有代表性的城市,每个城市都有自己独特...

PHP教程 2025-02-18 阅读0 评论0

探寻河北唐山历史与现代交融的城市之光

河北省唐山市,一座地处渤海之滨,拥有悠久历史和独特文化的城市。这里既是古丝绸之路的起点,也是中国近代工业的发源地。如今,唐山正以崭...

PHP教程 2025-02-18 阅读0 评论0