[原]swoole扩展MySQL连接池出现的连接丢失问题

之前一直使用PHP的Swoole扩展,主要用在MySQL数据库连接上,先上服务端代码(最初的参考连接:http://rango.swoole.com/archives/265):

$serv = new swoole_server('127.0.0.1', 3303, SWOOLE_PROCESS, SWOOLE_SOCK_TCP);//端口3303

$serv->set(array(
    'worker_num' => 2,      //worker线程的数量
    'task_worker_num' => 1, //MySQL连接的数量
    'daemonize' => true,       //守护进程
));

function my_onReceive($serv, $fd, $from_id, $data){
    //执行查询
    $result = $serv->taskwait($data);
    if ($result !== false) {
        $serv->send($fd, $result);
        return;
    } else {
        $serv->send($fd, "Error. Task timeout\n");
    }
}

function my_onTask($serv, $task_id, $from_id, $sql){
    static $link = NULL;
    if ($link == NULL) {
        $link = mysqli_connect('IP地址', '用户名', '密码', '数据库名称');
        //localhost=>UNIX Socket , IP地址=>TCP/IP
    }
    $result = $link->query($sql);

    if ($link->errno == 2006 || $link->errno == 2013){
        if (!@$link->ping()){
            //挂
            $link->close();
            $link = mysqli_connect('IP地址', '用户名', '密码', '数据库名称');
            $result = $link->query($sql);
        }
    }

    if ($result === false) {
        $serv->finish('b:0;');//语句运行失败,这是serialize后的false,下同理
        return;
    }
    if ($result === true){
        $serv->finish('b:1;');//写入操作成功
        return;
    }
    $data = $result->fetch_all(MYSQLI_ASSOC);
    $serv->finish(serialize($data));
}

function my_onFinish($serv, $data){
}

//设置回调函数
$serv->on('Receive', 'my_onReceive');
$serv->on('Task', 'my_onTask');
$serv->on('Finish', 'my_onFinish');

$serv->start();

 

在之前使用的时候,隔上一段时间或者长时间没有SQL查询,连接总会断掉并且无法重新链接,导致整体系统就挂掉了.

现在对原连接进行了简单的处理,每次查询完毕会检测错误代码,如果为2006或者2013会进行一次ping操作,检测到连接断掉了,就会关闭连接并且重新连接,重新执行刚才的SQL语句.

这样就可以避免服务中断了…

【原】MySQL 5.7新版本遇到的问题汇总

MySQL 5.7发布以后,近期也是第一次用,发现相比较之前的版本有很多改变,搞得之前很多做法已经并不适用了,在此记录一些遇到的问题,提醒一下朋友们。

一、安装MySQL后,默认用户root的密码不再“未设置”,不能使用:

#mysql -u root

这条命令登陆,必须加入-p参数,输入默认密码。

二、默认密码在mysqld.log文件中,可以使用命令:

# grep ‘temporary password’ /var/log/mysqld.log

查询默认密码,如果执行失败找不到mysqld.log文件,可使用:

find / -name ‘mysqld.log’

进行查找mysqld.log文件位置。

三、使用默认密码登陆以后,不能进行其他操作,需要更改默认密码方可继续操作,更改密码命令:

SQL>ALTER USER root@localhost IDENTIFIED BY ‘new_password’

注意:新密码必须包含大写小字母、数字、特殊字符,并且最少字符长度为8

附:

1、在MySQL 5.7之前的版本,在mysql.user表中,会存在`password`列;现在`password`列被更改为同表中的`authentication_string`列。

2、在mysql.user表中添加了`account_locked`列,创建了锁定用户的功能。

==========================

英文实在是我的硬伤,努力的途中。。。只看了一些与自己直接相关联的,话说从5.7.8开始,原生支持JSON,以后不用再以string方式存储JSON了,而是使用内部二进制存储,这个我还是比较关心的,,具体使用如果出什么问题再补充吧。

最后附上官方文档链接:

http://dev.mysql.com/doc/refman/5.7/en/mysql-nutshell.html