Swoole
協程 MySql
客戶端與 異步回調 MySql
客戶端的對比
為什么要對比這兩種不同模式的客戶端?
異步 MySQL 回調客戶端是雖然在 Swoole 1.8.6 版本就已經發布了,
但是異步回調的層層嵌套,讓編碼變得很別扭。
如今 Swoole 4.3 版本都已經發布了,並且已經支持協程化的 MySQL 客戶端,
這意味着可以完全采用同步編碼的模式,來進行程序開發了,
對於開發者來說這是一個大好的消息。
而且在 Swoole 4.3 版本之后,就已經移出了異步回調客戶端,
官方也一直推薦使用協程客戶端進行編碼。
Swoole
協程 Mysql
客戶端
從 Swoole 4.0
版本開始提供了完整的協程,應用層可以使用完全的同步模式的編程方式,底層自動實現異步IO。
Swoole
的 MySQL
協程客戶端需要在協程的上下文環境下執行。
具體的使用方法直接看下面的示例即可。
- 連接
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();
});
}
});
});
總結
- 在 Swoole 4.3 版本以后已經移出了異步回調模塊了。
- 以后的開發可以直接協程的客戶端進行編碼了。
- 協程客戶端需要在協程的上下文環境中進行編碼。
- 不建議在使用異步回調模塊。