Swoole 协程 MySql 客户端与 异步回调 MySql 客户端的对比

为什么要对比这两种不同模式的客户端?

异步 MySQL 回调客户端是虽然在 Swoole 1.8.6 版本就已经发布了,

但是异步回调的层层嵌套,让编码变得很别扭。

如今 Swoole 4.3 版本都已经发布了,并且已经支持协程化的 MySQL 客户端,

这意味着可以完全采用同步编码的模式,来进行程序开发了,

对于开发者来说这是一个大好的消息。

而且在 Swoole 4.3 版本之后,就已经移出了异步回调客户端,

官方也一直推荐使用协程客户端进行编码。

Swoole 协程 Mysql 客户端

Swoole 4.0 版本开始提供了完整的协程,应用层可以使用完全的同步模式的编程方式,底层自动实现异步IO。

SwooleMySQL 协程客户端需要在协程的上下文环境下执行。

具体的使用方法直接看下面的示例即可。

  • 连接 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 编译参数开启。

SwooleMysql 异步回调客户端的使用示例直接看下文即可。

注:异步回调客户端在 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 客户端的对比的更多相关文章

  1. [Sw] Swoole-4.2.9 可以尝试愉快应用 Swoole 协程

    大家知道 Swoole 提供了方便于服务器.网络编程的模式,简化了多进程编程. 这直接让 PHP 的运行很容易变成常驻内存的 Server 程序,执行效率上有了数倍的提升. 但是这一切还没有让人足够兴 ...

  2. Swoole 协程与 Go 协程的区别

    Swoole 协程与 Go 协程的区别 进程.线程.协程的概念 进程是什么? 进程就是应用程序的启动实例. 例如:打开一个软件,就是开启了一个进程. 进程拥有代码和打开的文件资源,数据资源,独立的内存 ...

  3. 阿里开源 iOS 协程开发框架 coobjc!--异步编程的问题与解决方案

    阿里妹导读:刚刚,阿里巴巴正式对外开源了基于 Apache 2.0 协议的协程开发框架 coobjc,开发者们可以在 Github 上自主下载.coobjc是为iOS平台打造的开源协程开发框架,支持O ...

  4. Python的异步编程[0] -> 协程[1] -> 使用协程建立自己的异步非阻塞模型

    使用协程建立自己的异步非阻塞模型 接下来例子中,将使用纯粹的Python编码搭建一个异步模型,相当于自己构建的一个asyncio模块,这也许能对asyncio模块底层实现的理解有更大的帮助.主要参考为 ...

  5. Swoole协程与传统fpm同步模式比较

    如果说数组是 PHP 的精髓,数组玩得不6的,根本不能算是会用PHP.那协程对于 Swoole 也是同理,不理解协程去用 Swoole,那就是在瞎用. 首先,Swoole 只能运行在命令行(Cli)模 ...

  6. swoole| swoole 协程初体验 转

    swoole| swoole 协程初体验   date: 2018-5-30 14:31:38title: swoole| swoole 协程初体验description: 通过协程的执行初窥 swo ...

  7. swoole协程通道channel

    swoole 协程通道 为了协程直接互相通讯传递数据 和go的通道很相似 Co\run(function(){ $chan = new Swoole\Coroutine\Channel(1); Swo ...

  8. swoole 协程介绍

    协程的执行顺序: 1 2 3 4 5 6 7 8 9 go(function () {     echo "hello go1 \n"; });   echo "hell ...

  9. Python 中的进程、线程、协程、同步、异步、回调

    进程和线程究竟是什么东西?传统网络服务模型是如何工作的?协程和线程的关系和区别有哪些?IO过程在什么时间发生? 一.上下文切换技术 简述 在进一步之前,让我们先回顾一下各种上下文切换技术. 不过首先说 ...

随机推荐

  1. HUD3689 Infinite monkey theorem

    Infinite monkey theorem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/ ...

  2. 【BZOJ1853/2393】[Scoi2010]幸运数字/Cirno的完美算数教室 DFS+容斥

    [BZOJ1853][Scoi2010]幸运数字 Description 在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的“幸运号码”是十进制表示中只包含数字6和8的那 ...

  3. spring事务和mysql的隔离级别

    mysql事务.mysql隔离级别.mysql锁.mysql数据一致性.Spring事务.Spring事务传播性之间的关系 一直有些模糊,整理一下.   mysql事务: 在mysql中,只有使用了I ...

  4. EasyNVR无插件直播服务器如何使用ffmpeg实现摄像机快照功能的

    EasyNVR提供快照预览功能,并且提供向EasyDSS云平台上传快照的功能 EasyNVR会定时向配置的摄像机抓取快照数据,保存图片用于预览,并且用于快照上传 原理 将从摄像机取出来的I帧数据编码成 ...

  5. EasyPlayerPro(Windows)流媒体播放器开发之接口设计

    EasyPlayerPro(windows)接口说明如下: EasyPlayerPro_Open 说明:打开一个媒体流或者媒体文件进行播放,同时返回一个 player 对象指针 参数说明: fileU ...

  6. 【分享】自己写的一个可空的DateTimePicker控件-附源码

    最近这段时间在重构以前的一个项目,其中有一项就是要把DateTimePicker控件值可空.大家都知道的DateTimePicker值为DateTime类型,DateTime类型值不能等于Null.但 ...

  7. 九度OJ 1156:谁是你的潜在朋友 (并查集)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5802 解决:2593 题目描述: "臭味相投"--这是我们描述朋友时喜欢用的词汇.两个人是朋友通常意味着他们存在着许多 ...

  8. cocos2d-js添加360广告联盟插屏(通过jsb反射机制)

    1.添加demo里的libs里的jar包 2.修改AndroidManifest.xml文件 添加权限: <uses-permission android:name="android. ...

  9. 剑指Offer:链表中环的入口节点【23】

    剑指Offer:链表中环的入口节点[23] 题目描述 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null. 题目分析 第一步确定链表中是否包含环,怎么确定呢?我们定义两个指针橙和 ...

  10. 主成分分析(PCA)与SVD奇异值分解

      主要参考:https://www.zhihu.com/question/38417101/answer/94338598 http://blog.jobbole.com/88208/ 先说下PCA ...