Swoole 协程 MySQL 客户端与异步回调 MySQL 客户端的对比
Swoole 协程 MySql 客户端与 异步回调 MySql 客户端的对比
为什么要对比这两种不同模式的客户端?
异步 MySQL 回调客户端是虽然在 Swoole 1.8.6 版本就已经发布了,
但是异步回调的层层嵌套,让编码变得很别扭。
如今 Swoole 4.3 版本都已经发布了,并且已经支持协程化的 MySQL 客户端,
这意味着可以完全采用同步编码的模式,来进行程序开发了,
对于开发者来说这是一个大好的消息。
而且在 Swoole 4.3 版本之后,就已经移出了异步回调客户端,
官方也一直推荐使用协程客户端进行编码。
Swoole 协程 Mysql 客户端
从 Swoole 4.0 版本开始提供了完整的协程,应用层可以使用完全的同步模式的编程方式,底层自动实现异步IO。
Swoole 的 MySQL 协程客户端需要在协程的上下文环境下执行。
具体的使用方法直接看下面的示例即可。
- 连接
Mysql协程客户端
co::create(function() {
$swoole_mysql = new Swoole\Coroutine\MySQL();
$swoole_mysql->connect([
'host' => 'mysql',
'port' => 3306,
'user' => 'root',
'password' => 'root',
'database' => 'fastadmin',
]);
$res = $swoole_mysql->query('select sleep(1)');
// 新增
// 更新
// 查询
// 删除
// 事务操作
// ......
});
- 新增操作
co::create(function() {
$stmt = $db->prepare('INSERT INTO runoob_tbl (runoob_title, runoob_author, submission_date) VALUES (?, ?, ?');
if ($stmt == false){
var_dump($db->errno, $db->error);
} else {
$ret2 = $stmt->execute(['学习 PHP', '学习 PHP', date("Y-m-d")]);
var_dump($ret2);
}
});
- 查询操作
co::create(function() {
$res = $swoole_mysql->query('SELECT * FROM runoob_tbl WHERE runoob_id=1');
if($res === false) {
return;
}
foreach ($res as $value) {
echo $value['runoob_title'];
}
});
- 更新操作
co::create(function() {
$stmt = $db->prepare('UPDATE runoob_tbl SET runoob_title=? WHERE runoob_id=?');
if ($stmt == false){
var_dump($db->errno, $db->error);
} else {
$ret2 = $stmt->execute(['学习 C++', 1]);
var_dump($ret2);
}
});
- 删除操作
co::create(function() {
$stmt = $db->prepare('DELETE FROM runoob_tbl WHERE runoob_id=1');
if ($stmt == false){
var_dump($db->errno, $db->error);
} else {
$ret2 = $stmt->execute(['学习 C++', 1]);
var_dump($ret2);
}
});
- 事务操作
co::create(function() {
$db->begin();
$stmt = $db->prepare('INSERT INTO runoob_tbl (runoob_title, runoob_author, submission_date) VALUES (?, ?, ?');
if ($stmt == false){
var_dump($db->errno, $db->error);
} else {
$ret2 = $stmt->execute(['学习 PHP', '学习 PHP', date("Y-m-d")]);
var_dump($ret2);
}
$stmt = $db->prepare('UPDATE runoob_tbl SET runoob_title=? WHERE runoob_id=?');
if ($stmt == false){
var_dump($db->errno, $db->error);
$db->rollback();
} else {
$ret2 = $stmt->execute(['学习 C++', 1]);
var_dump($ret2);
}
$db->commit();
});
Swoole 异步回调 Mysql 客户端
Swoole 在 1.8.6 版本提供了全新的异步 MySQL 客户端,底层实现了 MySQL 通信协议。
无需依赖其他第三方库,如 libmysqlclient, mysqlnd, mysqli 等。
无需通过 --enable-async-mysql 编译参数开启。
Swoole 的 Mysql 异步回调客户端的使用示例直接看下文即可。
注:异步回调客户端在 Swoole 4.3 版本已经被移出了(标志着已经过时了),建议使用协程客户端。
- 连接
Mysql数据库
$db = new swoole_mySQL();
$server = [
'host' => 'mysql',
'port' => 3306,
'user' => 'root',
'password' => 'root',
'database' => 'fastadmin',
'charset' => 'utf8',
'timeout' => 2
];
$db->connect($server, function ($db, $r) {
if ($r === false) {
var_dump($db->connect_errno, $db->connect_errno);
die();
}
// 新增
// 更新
// 查询
// 删除
// 事务操作
// ......
)
- 新增操作
// 新增
$sql = "INSERT INTO runoob_tbl (runoob_title, runoob_author, submission_date) VALUES (\"学习 PHP\", \"菜鸟教程\", NOW())";
$db->query($sql, function(swoole_mySQL $db, $r) {
if ($r === false) {
echo "新增数据失败, 错误信息: " . $db->error . ", 错误码: " . $db->errno . "\n";
} elseif ($r === true) {
echo "新增数据成功, ID为:" . $db->insert_id, ", 影响行数: " . $db->affected_rows . "\n";
}
$db->close();
});
- 更新操作
// 修改
$sql = "UPDATE runoob_tbl SET runoob_title='学习 C++' WHERE runoob_id=1";
$db->query($sql, function(swoole_mySQL $db, $r) {
if ($r === false) {
echo "新增数据失败, 错误信息: " . $db->error . ", 错误码: " . $db->errno . "\n";
} elseif ($r === true) {
echo "新增数据成功, ID为:" . $db->insert_id, ", 影响行数: " . $db->affected_rows . "\n";
}
var_dump($r);
$db->close();
});
- 查询操作
// 查询
$sql = "SELECT * FROM runoob_tbl WHERE runoob_id=1";
$db->query($sql, function(swoole_mySQL $db, $r) {
if ($r === false) {
echo "新增数据失败, 错误信息: " . $db->error . ", 错误码: " . $db->errno . "\n";
}
var_dump($r);
$db->close();
});
- 删除操作
// 删除
$sql = "DELETE FROM runoob_tbl WHERE runoob_id=1";
$db->query($sql, function(swoole_mySQL $db, $r) {
if ($r === false) {
echo "新增数据失败, 错误信息: " . $db->error . ", 错误码: " . $db->errno . "\n";
}
var_dump($r);
$db->close();
});
- 事务操作
// 事务
$db->begin(function(swoole_mySQL $db, $r) {
$sql = "INSERT INTO runoob_tbl (runoob_title, runoob_author, submission_date) VALUES (\"学习 PHP\", \"菜鸟教程\", NOW())";
$db->query($sql, function(swoole_mySQL $db, $r) {
if ($r === true) {
$sql = "UPDATE runoob_tbl SET runoob_title1='学习 C++' WHERE runoob_id=5";
$db->query($sql, function(swoole_mySQL $db, $r){
if ($r === true) {
$db->commit(function(swoole_mySQL $db, $r) {
if ($r === true) {
echo "commit ok \n";
}
});
}
if ($r === false) {
$db->rollback(function(swoole_mySQL $db, $r) {
if ($r === true) {
echo "commit failed, rollback success \n";
}
});
}
$db->close();
});
}
});
});
总结
- 在 Swoole 4.3 版本以后已经移出了异步回调模块了。
- 以后的开发可以直接协程的客户端进行编码了。
- 协程客户端需要在协程的上下文环境中进行编码。
- 不建议在使用异步回调模块。
参考文档
Swoole 协程 MySQL 客户端与异步回调 MySQL 客户端的对比的更多相关文章
- [Sw] Swoole-4.2.9 可以尝试愉快应用 Swoole 协程
大家知道 Swoole 提供了方便于服务器.网络编程的模式,简化了多进程编程. 这直接让 PHP 的运行很容易变成常驻内存的 Server 程序,执行效率上有了数倍的提升. 但是这一切还没有让人足够兴 ...
- Swoole 协程与 Go 协程的区别
Swoole 协程与 Go 协程的区别 进程.线程.协程的概念 进程是什么? 进程就是应用程序的启动实例. 例如:打开一个软件,就是开启了一个进程. 进程拥有代码和打开的文件资源,数据资源,独立的内存 ...
- 阿里开源 iOS 协程开发框架 coobjc!--异步编程的问题与解决方案
阿里妹导读:刚刚,阿里巴巴正式对外开源了基于 Apache 2.0 协议的协程开发框架 coobjc,开发者们可以在 Github 上自主下载.coobjc是为iOS平台打造的开源协程开发框架,支持O ...
- Python的异步编程[0] -> 协程[1] -> 使用协程建立自己的异步非阻塞模型
使用协程建立自己的异步非阻塞模型 接下来例子中,将使用纯粹的Python编码搭建一个异步模型,相当于自己构建的一个asyncio模块,这也许能对asyncio模块底层实现的理解有更大的帮助.主要参考为 ...
- Swoole协程与传统fpm同步模式比较
如果说数组是 PHP 的精髓,数组玩得不6的,根本不能算是会用PHP.那协程对于 Swoole 也是同理,不理解协程去用 Swoole,那就是在瞎用. 首先,Swoole 只能运行在命令行(Cli)模 ...
- swoole| swoole 协程初体验 转
swoole| swoole 协程初体验 date: 2018-5-30 14:31:38title: swoole| swoole 协程初体验description: 通过协程的执行初窥 swo ...
- swoole协程通道channel
swoole 协程通道 为了协程直接互相通讯传递数据 和go的通道很相似 Co\run(function(){ $chan = new Swoole\Coroutine\Channel(1); Swo ...
- swoole 协程介绍
协程的执行顺序: 1 2 3 4 5 6 7 8 9 go(function () { echo "hello go1 \n"; }); echo "hell ...
- Python 中的进程、线程、协程、同步、异步、回调
进程和线程究竟是什么东西?传统网络服务模型是如何工作的?协程和线程的关系和区别有哪些?IO过程在什么时间发生? 一.上下文切换技术 简述 在进一步之前,让我们先回顾一下各种上下文切换技术. 不过首先说 ...
随机推荐
- EasyPlayerPro(Windows)流媒体播放器开发之框架讲解
EasyPlayerPro for Windows是基于ffmpeg进行开发的全功能播放器,开发过程中参考了很多开源的播放器,诸如vlc和ffplay等,其中最强大的莫过于vlc,但是鉴于vlc框架过 ...
- Webpack探索【10】--- 懒加载详解
本文主要讲懒加载方面相关内容.
- CentOS7的/tmp目录自动清理规则(转)
CentOS7的/tmp目录自动清理规则 CentOS6以下系统(含)使用watchtmp + cron来实现定时清理临时文件的效果,这点在CentOS7发生了变化,在CentOS7下,系统使用sys ...
- php依据地理坐标获取国家、省份、城市,及周边数据类
功能:当App获取到用户的地理坐标时,能够依据坐标知道用户当前在那个国家.省份.城市.及周边有什么数据. 原理:基于百度Geocoding API 实现.须要先注冊百度开发人员.然后申请百度AK(密钥 ...
- JavaScript toFixed() 方法注意点
定义和用法 toFixed() 方法可把 Number 四舍五入为指定小数位数的数字. 语法 NumberObject.toFixed(num) 参数 描述 num 必需.规定小数的位数,是 0 ~ ...
- Java线程池的配置
1.ThreadPoolExecutor的重要参数 1.corePoolSize:核心线程数 * 核心线程会一直存活,及时没有任务需要执行 * 当线程数小于核心线程数时,即使有线程空闲,线程池也会优先 ...
- Vue-router进阶、单页面应用(SPA)带来的问题
一 . vue-router 进阶 回顾学过的vue-router,并参考官方文档学习嵌套路由等路由相关知识. 二 . 单页面应用(SPA)带来的问题 1 . 虽然单页面应用有优点 , 但是,如果后端 ...
- IOS 关于 NSUserDefault
转载 并不是所有的东西都能往里放的.NSUserDefaults只支持: NSString, NSNumber, NSDate, NSArray, NSDictionary. NSUserDefa ...
- Linux学习之路(二)文件处理命令之下
分区格式化: 一块分区想要使用的话,要格式化.格式化主要有两个工作,1,把分区分成等大小的数据块,每个数据块一般为4KB.2在分区之前建一个分区表,给第一个文件建一行相关数据,在分区表里保存了它的io ...
- matlab的代码注释
1.注释一块代码: %{ 此处代码块 %} 2.注释数行代码: 先选中,然后用组合键Ctrl+R 取消注释,用组合键Ctrl+T 3.双%%的作用:代码分块运行,点击双%%之间的代码,再点Run Se ...