企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# 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 = '/(?<!:)\/\/.*|\/\\*(\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); } } ~~~