- Coroutine\MySQL
- 启用协程MySQL客户端
- 使用示例
- defer特性
- 存储过程
- MySQL8.0
- 4.0.1 以下版本
- SQL 文件
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);}}
