Swoole
協程 MySql
客戶端與 異步回調 MySql
客戶端的對比爲何要對比這兩種不一樣模式的客戶端?html
異步 MySQL 回調客戶端是雖然在 Swoole 1.8.6 版本就已經發布了,
可是異步回調的層層嵌套,讓編碼變得很彆扭。
現在 Swoole 4.3 版本都已經發布了,而且已經支持協程化的 MySQL 客戶端,
這意味着能夠徹底採用同步編碼的模式,來進行程序開發了,
對於開發者來講這是一個大好的消息。
並且在 Swoole 4.3 版本以後,就已經移出了異步回調客戶端,
官方也一直推薦使用協程客戶端進行編碼。mysql
Swoole
協程 Mysql
客戶端從 Swoole 4.0
版本開始提供了完整的協程,應用層可使用徹底的同步模式的編程方式,底層自動實現異步IO。
Swoole
的 MySQL
協程客戶端須要在協程的上下文環境下執行。
具體的使用方法直接看下面的示例便可。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
編譯參數開啓。
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(); }); } }); });