当前位置 > it书童 > swoole > 正文
推荐小册
java高效编程
怎样更高效地用 java 编程

juc并发工具库
java并发编程工具库

设计模式
设计模式

jvm调优
jvm调优

rabbitmq实战
rabbitmq实战

redis实战
redis实战

Keepavlied高可用集群
Keepavlied高可用集群

nginx入门到实战
nginx入门到实战

java调试
java调试中遇到的各种坑

java输入输出流
java输入输出流

swoole 异步mysql

swoole it书童 2019-10-04 14:22:05 0赞 0踩 610阅读 0评论

模拟数据

在本地test数据库中新建book表,写入模拟数据

CREATE TABLE `book` 
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `content` text,(
  `titlle` varchar(255) NOT NULL COMMENT '标题',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert into book value (1, '科幻小说', '三体');

异步mysql

<?php
class AsyMysql {
    public $db;
    public $config = [];
    public function __construct()
    {
        $this->db = new swoole_mysql();
        $this->config = [
            'host' => '127.0.0.1',
            'port' => '3306',
            'user' => 'root',
            'password' => '',
            'database' => 'test',
            'charset' => 'utf8',
        ];
    }

    public function execute($id, $content) {
        try {
            $this->db->connect($this->config, function ($db, $result) use ($id, $content) {
                if ($result === false) {
                    // 连接失败
                    var_dump($db->connect_error);
                }
                $sql = "update book set `content` = '{$content}' where id = {$id}";
                $db->query($sql, function ($db, $result) {
                    if ($result === false) {
                        var_dump($db->error);
                    } else if ($result === true) {
                        var_dump($db->affected_rows);
                    } else {
                        var_dump($result);
                    }
                });
                echo '执行成功' . PHP_EOL;
                $db->close();
            });
        } catch (\Swoole\Mysql\Exception $e) {
            echo $e->getMessage();
        }

        return true;
    }
}

$obj = new AsyMysql();
$flag = $obj->execute(1,'大刘写的科幻小说');
echo "开始执行" . PHP_EOL;

执行结果

$ php mysql.php
开始执行
执行成功
[2018-07-27 15:24:27 @65638.0]	TRACE	[THREAD #0]EP=3|FD=4

连接时长

默认情况下,mysql的等待连接时长为1秒,超时会报错,如在代码最后加上

$obj = new AsyMysql();
$flag = $obj->execute(1,'大刘写的科幻小说');
echo "开始执行" . PHP_EOL;
sleep(3); // 暂停3秒

通过设置超时时间可解决该问题:

$this->config = [
    'host' => '127.0.0.1',
    'port' => '3306',
    'user' => 'root',
    'password' => '',
    'database' => 'test',
    'charset' => 'utf8',
    'timeout' => 5, // 设置超时时间
];
关于我
一个文科出身的程序员,追求做个有趣的人,传播有价值的知识,微信公众号主要分享读书思考心得,不会有代码类文章,非程序员的同学请放心订阅
转载须注明出处:https://www.itshutong.com/articles/115/swoole-asynchronous-mysql