Coroutine\MySQL

启用协程MySQL客户端

  • 请勿同时使用异步回调和协程MySQL

使用示例

  1. $swoole_mysql = new Swoole\Coroutine\MySQL();
  2. $swoole_mysql->connect([
  3. 'host' => '127.0.0.1',
  4. 'port' => 3306,
  5. 'user' => 'user',
  6. 'password' => 'pass',
  7. 'database' => 'test',
  8. ]);
  9. $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命令行执行以下操作来兼容:

  1. ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
  2. flush privileges;

将语句中的 'root'@'localhost' 替换成你所使用的用户, password 替换成其密码.

如仍无法使用, 应在my.cnf中设置 default_authentication_plugin = mysql_native_password

SQL 文件

  1. function read_sql_file(string $file)
  2. {
  3. $comment_regex = '/(?<!:)\/\/.*|\/\\*(\s|.)*?\*\/|--[^\n]+/';
  4. $lines = explode("\n", preg_replace($comment_regex, '', co::readFile($file)));
  5. $init_sql = [];
  6. $multi = false;
  7. foreach ($lines as $index => $line) {
  8. if (strlen($line) === 0) {
  9. continue;
  10. }
  11. if (substr($line, -1, 1) !== ';') {
  12. if (!$multi) {
  13. $multi = true;
  14. goto _new_line;
  15. } else {
  16. _append:
  17. $end_line = &$init_sql[count($init_sql) - 1];
  18. $end_line = $end_line . $line . "\n";
  19. }
  20. } else {
  21. if ($multi) {
  22. $multi = false;
  23. goto _append;
  24. } else {
  25. $multi = false;
  26. _new_line:
  27. $init_sql[] = "{$line}";
  28. }
  29. }
  30. }
  31. return $init_sql;
  32. }
  33. $sql_file = read_sql_file(__DIR__ . '/test.sql');
  34. foreach ($sql_file as $line) {
  35. if (!$mysql->query($line)) {
  36. echo "Failed! Error#{$mysql->errno}: {$mysql->error}\n";
  37. exit(1);
  38. }
  39. }