Swoole 協程 MySQL 客戶端與異步回調 MySQL 客戶端的對比

Swoole 協程 MySql 客戶端與 異步回調 MySql 客戶端的對比

爲何要對比這兩種不一樣模式的客戶端?html

異步 MySQL 回調客戶端是雖然在 Swoole 1.8.6 版本就已經發布了,
可是異步回調的層層嵌套,讓編碼變得很彆扭。
現在 Swoole 4.3 版本都已經發布了,而且已經支持協程化的 MySQL 客戶端,
這意味着能夠徹底採用同步編碼的模式,來進行程序開發了,
對於開發者來講這是一個大好的消息。
並且在 Swoole 4.3 版本以後,就已經移出了異步回調客戶端,
官方也一直推薦使用協程客戶端進行編碼。mysql

Swoole 協程 Mysql 客戶端

Swoole 4.0 版本開始提供了完整的協程,應用層可使用徹底的同步模式的編程方式,底層自動實現異步IO。
SwooleMySQL 協程客戶端須要在協程的上下文環境下執行。
具體的使用方法直接看下面的示例便可。sql

  • 鏈接 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 版本之後已經移出了異步回調模塊了。
  • 之後的開發能夠直接協程的客戶端進行編碼了。
  • 協程客戶端須要在協程的上下文環境中進行編碼。
  • 不建議在使用異步回調模塊。

參考文檔

相關文章
相關標籤/搜索