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过程在什么时间发生? 一.上下文切换技术 简述 在进一步之前,让我们先回顾一下各种上下文切换技术. 不过首先说 ...
随机推荐
- intellij idea同一个窗口打开多个项目
1 将多个maven项目放在同一个目录 2 file --> open该目录 intellij 将会加载该目录下所有的项目. 3 依赖加载 maven projects--->" ...
- IIS的ARR实现站点的负载均衡 nginx 对比
windows下使用IIS的ARR实现站点的负载均衡 - CSDN博客 https://blog.csdn.net/zzy7075/article/details/73294713 IIS的ARR实现 ...
- m*n matrix min rank square matrix
m*n matrix m*n=1000 f(A)=25 https://www.cs.princeton.edu/courses/archive/spring12/cos598C/svdchapter ...
- 【题解】 P1373 小a和uim之大逃离
题解 P1373 小a和uim之大逃离 传送门 一道dp好题 乍看此题,感觉要这样设计: \(dp(x)(y)(mod_{a})(mod_{uim})(0/1)\) , 但是我上午考试就MLE了,赶紧 ...
- SAP 4代增强
*20170325 160000 以下之外, 还有:.替代, -用过一次:.BTE -没用过,需要学习: 第二代增强和第三代增强的差别: 1.Tcode 不同:第二代: CMOD 增强管理,SMOD ...
- ZooKeeper原理及使用(转)
原文地址 ZooKeeper是Hadoop Ecosystem中非常重要的组件,它的主要功能是为分布式系统提供一致性协调(Coordination)服务,与之对应的Google的类似服务叫Chubby ...
- pinpoint本地开发-web模块
web模块中的前端依赖会导致工程很难打包成功,对于这些,我们可以直接注释掉 比如: <plugin> <groupId>com.github.eirslett</grou ...
- 你不得不知的几款常用的在线API管理工具
在项目开发过程中,总会涉及到接口文档的设计编写,之前使用的都是ms office工具,不够漂亮也不直观,变更频繁的话维护成本也更高,及时性也是大问题.基于这个背景,下面介绍几个常用的API管理工具,方 ...
- property 中的strong 与weak
strong关键字与retain关似,用了它,引用计数自动+1,用实例更能说明一切 @property (nonatomic, strong) NSString *string1; @property ...
- 【python】用python脚本Paramiko实现远程执行命令、下载、推送/上传文件功能
Paramiko: paramiko模块,基于SSH用于连接远程服务器并执行相关操作. SSHClient: 用于连接远程服务器并执行基本命令 SFTPClient: 用于连接远程服务器并执行上传下载 ...