加入收藏 | 设为首页 | 会员中心 | 我要投稿 汽车网 (https://www.0577qiche.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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(); 

 

(编辑:汽车网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章