Coroutine\MySQL
启用协程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一节。
存储过程
从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 = '/(?<!:)\/\/.*|\/\\*(\s|.)*?\*\/|--[^\n]+/';
$lines = explode("\n", preg_replace($comment_regex, '', co::readFile($file)));
$init_sql = [];
$multi = false;
foreach ($lines as $index => $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);
}
}