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

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

异步 MySQL 回调客户端是虽然在 Swoole 1.8.6 版本就已经发布了,
但是异步回调的层层嵌套,让编码变得很别扭。
如今 Swoole 4.3 版本都已经发布了,并且已经支持协程化的 MySQL 客户端,
这意味着可以完全采用同步编码的模式,来进行程序开发了,
对于开发者来说这是一个大好的消息。
而且在 Swoole 4.3 版本之后,就已经移出了异步回调客户端,
官方也一直推荐使用协程客户端进行编码。

一、Swoole 协程 MySQL 客户端

从 Swoole 4.0 版本开始提供了完整的协程,
应用层可以使用完全的同步模式的编程方式,底层自动实现异步 IO。
Swoole 的 MySQL 协程客户端需要在协程的上下文环境下执行。
具体的使用方法直接看下面的示例即可。

1. 连接 MySQL 数据库

<?php

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)');

    // 新增
    // 更新
    // 查询
    // 删除
    // 事务操作
    // ......
});

2. 新增操作

<?php

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);
    }
});

3. 查询操作

<?php

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'];
    } 
});

4. 更新操作

<?php

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);
    }
});

5. 删除操作

<?php

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);
    }
});

6. 事务操作

<?php

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 版本已经被移出了(标志着已经过时了),建议使用协程客户端。

1. 连接 MySQL 数据库

<?php

$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();
    }

    // 新增
    // 更新
    // 查询
    // 删除
    // 事务操作
    // ......
)

2. 新增操作

<?php

// 新增
$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();
});

3. 更新操作

<?php

// 修改
$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();
});

4. 查询操作

<?php

// 查询
$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();
});

5. 删除操作

<?php

// 删除
$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();
});

6. 事务操作

<?php

// 事务
$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 版本以后已经移出了异步回调模块了。
  • 以后的开发可以直接协程的客户端进行编码了。
  • 协程客户端需要在协程的上下文环境中进行编码。
  • 不建议再使用异步回调模块。
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 1

协程大法好swoole大法好

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!