• Coroutine\MySQL
    • 启用协程MySQL客户端
    • 使用示例
    • defer特性
    • 存储过程
    • MySQL8.0
      • 4.0.1 以下版本
  • SQL 文件

    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. }