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);
    }
}


  • 挖坑人

    ERROR zm_deactivate_swoole (ERROR 503): Fatal error: Maximum function nesting level of '256' reached, aborting! in index.php on line 3.

  • 张良晖

    没有语言层面的coroutine的基本语义,在connect,query函数内部隐藏了事件循环,那连接池也只能在swoole里实现吧。PHP层面还是没法实现连接池,连接池满了,申请连接的操作不能阻塞,又没法实现轮询。没有连接池,异步的优势又被mysql的并发能力限制住了

  • 泷涯

    去掉xdebug

  • copy

    PHP Warning: Swoole\Coroutine\MySQL::query(): mysql client is waiting response, cannot send new sql query.不能连续执行两个查询?文档要是再清楚点就好了,简直不知道从何下手解决这个问题

  • copy

    问题解决 每次执行下$ws->mysql->recv();就可以了

  • 谁爱这不息的变幻

    zm_deactivate_swoole (ERROR 503): Fatal error: Maximum function nesting level of '256' reached, aborting! in /Users/gaomingjun/Developer/Workspace/zhuoyicp/lumen/vendor/laravel/lumen-framework/src/Concerns/RegistersExceptionHandlers.php on line 58. [2017-04-28 11:39:35 $78402.0] WARNING swManager_check_exit_status: worker#3 abnormal exit, status=255, signal=0

  • copperfield

    要实现连接池,还得自己实现一个php调度 协程,所以目前这个新特性只能算是一点餐后小甜点

  • 没有escape_string方法吗

  • 吾爱

    没有close方法吗

  • 活着

    有defer特性~!

  • 一个好人

    可不可以考虑单个连接多次执行query,每个query堆栈压入,获取结果recv的时候pop出来;那么多条sql理论上就可以并行获得结果集了;或者每个query都返回一个唯一ID,recev里面传入唯一ID,这样也能大大的提高单个请求对mysql的IO复用的效率了。不知道行不行的通

  • 风居住的街道

    为什么使用事例代码会报这个错误 Uncaught Swoole\Error: operation not support (reactor is not ready) in /www/game/IoMysql/IoMysql.php:4 ,我安装的是最新的swoole版本

  • PHP Fatal error: Uncaught Swoole\Error: operation not support (reactor is not ready),请问怎么开启

  • 秋枫

    coroutine/mysql 事务中可以使用coroutine/redis的setDefer机制吗

  • Null

    PHP Fatal error: Uncaught Swoole\Error: operation not support (reactor is not ready),这个问题怎么解决

  • Null

    PHP Fatal error: Uncaught Swoole\Error: operation not support (reactor is not ready),这个问题怎么解决

  • Null

    PHP Fatal error: Uncaught Swoole\Error: operation not support (reactor is not ready),这个问题怎么解决

  • Null

    PHP Fatal error: Uncaught Swoole\Error: operation not support (reactor is not ready),这个问题怎么解决

  • dicky2019

    按照文档所说启用协程MySQL客户端,返回PHP Fatal error: Uncaught Swoole\Error: operation not support (reactor is not ready),这样使用才行 go(function () { $db = new Co\MySQL(); $server = array( 'host' => 'XXXX', 'port' => 3306, 'user' => 'root', 'password' => 'XXXX', 'database' => 'swoole', );

    $db->connect($server);
    
    $result = $db->query('SELECT * FROM ds_user WHERE id = 3');
    var_dump($result);
    

    });

    或者这样

    co::create(function() { $swoole_mysql = new Swoole\Coroutine\MySQL(); $swoole_mysql->connect([ 'host' => 'XXXXX', 'port' => 3306, 'user' => 'root', 'password' => 'XXXX', 'database' => 'swoole', ]); $res = $swoole_mysql->query('select sleep(1)'); var_dump($res);

    });

  • dicky2019

    官方文档更新跟不上啊,慕课网的swoole视频教程版本2.1,跟现在最新的4.4.3差别太大啦,希望官方文档尽快更新,让我们这些开发者少少踩坑

  • 来杯可乐吧

    Uncaught Swoole\Error: operation not support (reactor is not ready) in /WWW/swoole/io/mysql.php:4

  • 泉州吴彦祖

    上面那几位兄弟,你们报那个错误是因为你们直接用php程序运行了,你们试试在代码外面套个go(function(){ ....这里写内容}) 在function函数里面执行上面代码,或者request、receive等事件中运行 文档在这个模块的首页有这样子的提示: 底层在onRequet, onReceive, onConnect等事件回调之前自动创建一个协程,在回调函数中使用协程API

  • mrmsl

    while 里面报错 SQLSTATE[HY000] [2002] Connection reset by peer or Transport endpoint is not connected