php-msf源码说明
发布时间:2023-09-23 11:00:36 所属栏目:PHP教程 来源:
导读:我们来看分享下具体源码:php-msf: https://github.com/pinguo/php-msf
源码解读也做了一段时间了, 总结一下自己的心得:
从工程化的角度去看这个项目, 主要和上面的 架构 区分, 在处理核心业务, 也就是上面的
源码解读也做了一段时间了, 总结一下自己的心得:
从工程化的角度去看这个项目, 主要和上面的 架构 区分, 在处理核心业务, 也就是上面的
我们来看分享下具体源码:php-msf: https://github.com/pinguo/php-msf 源码解读也做了一段时间了, 总结一下自己的心得: 从工程化的角度去看这个项目, 主要和上面的 架构 区分, 在处理核心业务, 也就是上面的 功能/特性 外, 工程化还涉及到 安全/测试/编码规范/语言特性 等方面, 这些也是平时在写业务代码时思考较少并且实践较少的部分 工具的使用, 推荐我现在使用的组合: phpstorm + 百度脑图 + Markdown笔记 + blog和 php-msf 的渊源等写技术生活相关的 blog 再来和大家吧, 直接上菜. 我会用我的方式来讲解, 如果需要深入了解的, 可以看我后面推荐的资源. 类 vs 对象 是一组很重要的概念. 类代表我们对事物的抽象, 这个抽象的能力在我们以后会一直用到, 希望大家有意识地培养这方面的意识, 至少可以起到触类旁通的作用. 对象是 实例化 的类, 是 真正干活的, 我们要讨论的 协程, 就是这样一个 真正干活的 角色. 现在, 我们再来看看协程的使用方式对比, 这里注意一下, 我没有用 协程的实现方式对比, 因为很多时候, 需求实际是这样的: 怎么实现我不管, 我选最好用的. // msf - 单次协程调度 $response = yield $this->getRedisPool('tw')->get('apiCacheForABCoroutine'); // msf - 并发协程调用 $client1 = $this->getObject(Client::class, ['http://www.baidu.com/']); yield $client1->goDnsLookup(); $client2 = $this->getObject(Client::class, ['http://www.qq.com/']); yield $client2->goDnsLookup(); $result[] = yield $client1->goGet('/'); $result[] = yield $client2->goGet('/'); 大致 是这样的一个等式: 使用协程 = 加上 yield, 所以搞清楚哪些地方需要加上 yield 就好了 -- 有阻塞IO的地方, 比如 文件IO, 网络IO(redis/mysql/http) 等. 当然, 大致 就是还有需要注意的地方 协程调度顺序, 如果不注意, 就可能会退化成同步调用. 调用链: 使用 yield 的调用链上, 都需要加上 yield. 比如下面这样: function a_test() { return yield $this->getRedisPool('tw')->get('apiCacheForABCoroutine'); } $res = yield a_test(); 如果不加 yield, 就变成了同步执行,对比一下 swoole2.0 的协程方案: $server = new Swoole/Http/Server("127.0.0.1", 9502, SWOOLE_BASE); $server->set([ 'worker_num' => 1, ]); // 需要在协程 server 的异步回调函数中 $server->on('Request', function ($request, $response) { $tcpclient = new Swoole/Coroutine/Client(SWOOLE_SOCK_TCP); // 需要配合使用协程客户端 $tcpclient->connect('127.0.0.1', 9501,0.5) $tcpclient->send("hello world/n"); $redis = new Swoole/Coroutine/Redis(); $redis->connect('127.0.0.1', 6379); $redis->setDefer(); // 标注延迟收包, 实现并发调用 $redis->get('key'); $mysql = new Swoole/Coroutine/MySQL(); $mysql->connect([ 'host' => '127.0.0.1', 'user' => 'user', 'password' => 'pass', 'database' => 'test', ]); $mysql->setDefer(); $mysql->query('select sleep(1)'); $httpclient = new Swoole/Coroutine/Http/Client('0.0.0.0', 9599); $httpclient->setHeaders(['Host' => "api.mp.qq.com"]); $httpclient->set([ 'timeout' => 1]); $httpclient->setDefer(); $httpclient->get('/'); $tcp_res = $tcpclient->recv(); $redis_res = $redis->recv(); $mysql_res = $mysql->recv(); $http_res = $httpclient->recv(); $response->end('Test End'); });//Cuoxin.com $server->start(); (编辑:汽车网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐