菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
2675
1

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

原创
05/13 14:22
阅读数 2453

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

异步 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 版本以后已经移出了异步回调模块了。
  • 以后的开发可以直接协程的客户端进行编码了。
  • 协程客户端需要在协程的上下文环境中进行编码。
  • 不建议再使用异步回调模块。

发表评论

0/200
2675 点赞
1 评论
收藏
为你推荐 换一批