四十、Swoole 基础学习笔记 - Swoole 一键协程化(Swoole 基础系列完)
hi,我是温新,一名PHPer
文章基于 Swoole 5.0.1 版本编写。
学习目标:学习一键协程化
说明:本篇文章结合官方文档编写及参考网络资料编写,虽非全部原创,但也是结合了自己的理解,若转载请附带本文 URL,编写不易,持续编写更不易,谢谢!
Swoole 系列代码已上传至 Github:https://github.com/ziruchu/Swoole
协程化客户端(MySQL、Redis)官方已经不推荐使用了。推荐使用 一键协程化
来操作。为什么不推荐使用 MySQL 等协程客户端,官方已经文档已经有了很详细的说明。
一键协程化
Swoole 开发组采用Hook
原生 PHP 函数的方式实现协程客户端,通过一行代码就可以让原来的同步 IO 的代码变成可以协程调度
的异步 IO
,即一键协程化。
一键协程化有什么好处?
1、一键协程化对我们编写代码没有什么改变,以前怎么写,现在还是怎么写;
2、只有在一些涉及 IO 操作时才会协程调度;
3、经使用 MySQL 等协程客户端,可以使用原生的 API 操作。
一键协程案例
<?php
// 40-coroutine.php
// 开启协程调度
Swoole\Runtime::enableCoroutine();
// 案例一
for ($c = 1000; $c--;) {
go(function () {//创建100个协程
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);//此处产生协程调度,cpu切到下一个协程,不会阻塞进程
$redis->set('name', '王美丽');
echo $redis->get('name');//此处产生协程调度,cpu切到下一个协程,不会阻塞进程
});
}
// 案例二
go(function () {
// 使用原生数据库方式操作
$dsn = "mysql:host=127.0.0.1;dbname=test1";
$pdo = new PDO($dsn, 'test', 'test');
$statement = $pdo->query("select * from test7 ");
$row = $statement->fetch(PDO::FETCH_ASSOC);
print_r($row);
});
// 案例三
go(function () {
echo '我会先输出' . PHP_EOL;
});
这个案例中,开启了一键协程化,案例三会第一个输出,案例一和案例二谁先谁后不一定。
输出结果
$php 40-coroutine.php
我会先输出
王美丽王美丽
Array
(
[a] => 1
[b] => 1
)
王美丽
不使用一键协程化
<?php
// 40-coroutine-1.php
// 案例一
for ($c = 1000; $c--;) {
go(function () {//创建100个协程
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);//此处产生协程调度,cpu切到下一个协程,不会阻塞进程
$redis->set('name', '王美丽');
echo $redis->get('name');//此处产生协程调度,cpu切到下一个协程,不会阻塞进程
});
}
// 案例二
go(function () {
// 使用原生数据库方式操作
$dsn = "mysql:host=127.0.0.1;dbname=test1";
$pdo = new PDO($dsn, 'tset', 'test');
$statement = $pdo->query("select * from test7");
$row = $statement->fetch(PDO::FETCH_ASSOC);
print_r($row);
});
// 案例三
go(function () {
echo '我会先输出吗?' . PHP_EOL;
});
不使用一键协程,程序在运行过程中,只有案例一运行结束,再运行案例二,最后运行案例三。一定要动手演示哦!
Swoole 基础系列到这里就完结了。很遗憾的是,遗留下事件,关于这面方面的知识我会去补充学习。
关于事件,如果你有什么好的文章或易懂的书籍,希望推荐一下,谢谢!
Swoole 基础系列已经结束,但这仅仅只是开始。新规划开启!
嗨,Swoole 基础系列结束;你好 Hyperf 3.0!
请登录后再评论