swoole一键携程化mysql_【SWOOLE系列】浅淡SWOOLE协程(二) 一键协程化

本文介绍了Swoole协程中遇到的堵塞问题,并详细解析了Swoole如何通过Hook原生PHP函数实现一键协程化,以解决在协程环境中调用堵塞函数的问题。通过示例代码和源码分析,揭示了Swoole一键协程化的原理和实现方式。
摘要由CSDN通过智能技术生成

前言

是的,我又来了,我带着我的文章表情包回来。

再这感谢swoole大佬们的点赞和转载,让我短暂的感受到了什么要叫高光时刻。

d4af5542cb8796474eba9527f77649a4.png

背景

我相信大部分人一开始用swoole的协程的时候都会再协程里写了一大堆堵塞的函数,导致项目崩溃。(是的!不要告诉我!就我一个人!)

50f9b0a573773a29bd6fedbd892d660b.png

在大家了解上一篇【菜鸟光系列】浅谈SWOOLE协程篇

可以了解到协程的创建、yield、resume的相关流程和代码。

所以我们可以猜到在协程执行IO堵塞的相关的代码段是需要主动去yield并且在reactor监听,那么使用原生的php的函数(例curl、文件操作、sleep....)是不可能会主动触发yield()

$time = time();

go(function () {

sleep(2);

echo "done1" . PHP_EOL;

});

go(function () {

sleep(2);

echo "done2" . PHP_EOL;

});

go(function () {

sleep(2);

echo "done3" . PHP_EOL;

});

echo "over" . PHP_EOL;

echo time() - $time;

输出内容

done1

done2

done3

over

6

以上就是一个反面例子,下面列举下在协程里那些不能调用的函数

f089e265a4aa59bd4f2f78abea077eb5.png

那些传说中的php堵塞函数

* mysql、mysqli、pdo以及其他DB操作函数

* sleep、usleep

* curl_*相关函数

* stream、socket扩展的函数

* swoole\_client同步模式

* memcache、redis扩展函数

那么肯定有人会说,哇 我用个协程还要拿小本本记住下那么多不用调用的,谁家孩子受得了啊。事实上总有很多人再协程上调用各种IO堵塞的函数

所以swoole那些大佬为了让我们这些孩子能够愉快的使用协程,掉秃噜皮了想到了一键协程化。

timg?image&quality=80&size=b9999_10000&sec=1593862395537&di=0a2e58a003ff6df43295ac006cd09ec3&imgtype=0&src=http%3A%2F%2Fimg.bqatj.com%2Fimg%2F9b28b469ed8aa937.jpg

一键协程化

那我们来瞅瞅官方说的(一键协程化让我想起了以前的一键环境安装的工具。真的是菜鸟福音,发际线的恩人!)

针对上述问题,我们换了实现思路,采用 Hook 原生 PHP 函数的方式实现协程客户端,通过一行代码就可以让原来的同步 IO 的代码变成可以协程调度的异步 IO,即一键协程化。

又到了划重点提问题的时候了,Hook原生PHP的函数,大家可以换个角度思考,如果是我来实现,我可能要挨个把PHP原生堵塞的函数挨个重写成支持协程的方式,但是这样的工作量成本特别的巨大,所以为了验证自己的猜想来分析下一键协程化的源码实现

591c3f30dad962c08ecd195a77703440.png

源码分析

为了不误导大家 这里使用的swoole版本为最新的4.5.2的源码

一键协程化提供给PHP的API

Swoole\Runtime::enableCoroutine($flags =

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值