Coroutine\MySQL
最后更新于:2022-04-02 06:28:40
# Coroutine\\MySQL
[TOC]
## 启用协程MySQL客户端
* **请勿同时使用异步回调和协程`MySQL`**
## 使用示例
~~~
$swoole_mysql = new Swoole\Coroutine\MySQL();
$swoole_mysql->connect([
'host' => '127.0.0.1',
'port' => 3306,
'user' => 'user',
'password' => 'pass',
'database' => 'test',
]);
$res = $swoole_mysql->query('select sleep(1)');
~~~
## defer特性
请参考[并发Client](并发调用.md)一节。
## 存储过程
从`4.0.0`版本后, 支持`MySQL`存储过程和多结果集获取
## MySQL8.0
`Swoole-4.0.1`或更高版本支持了`MySQL8`所有的安全验证能力, 可以直接正常使用客户端,而无需回退密码设定
* * *
#### 4.0.1 以下版本
`MySQL-8.0`默认使用了安全性更强的`caching_sha2_password`插件, 如果是从`5.x`升级上来的, 可以直接使用所有`MySQL`功能, 如是新建的`MySQL`, 需要进入`MySQL`命令行执行以下操作来兼容:
~~~
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
flush privileges;
~~~
将语句中的`'root'@'localhost'`替换成你所使用的用户,`password`替换成其密码.
如仍无法使用, 应在my.cnf中设置`default_authentication_plugin = mysql_native_password`
## SQL 文件
~~~
function read_sql_file(string $file)
{
$comment_regex = '/(? $line) {
if (strlen($line) === 0) {
continue;
}
if (substr($line, -1, 1) !== ';') {
if (!$multi) {
$multi = true;
goto _new_line;
} else {
_append:
$end_line = &$init_sql[count($init_sql) - 1];
$end_line = $end_line . $line . "\n";
}
} else {
if ($multi) {
$multi = false;
goto _append;
} else {
$multi = false;
_new_line:
$init_sql[] = "{$line}";
}
}
}
return $init_sql;
}
$sql_file = read_sql_file(__DIR__ . '/test.sql');
foreach ($sql_file as $line) {
if (!$mysql->query($line)) {
echo "Failed! Error#{$mysql->errno}: {$mysql->error}\n";
exit(1);
}
}
~~~
';