前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >php mysql 异步, php mysql 异步并发查询

php mysql 异步, php mysql 异步并发查询

原创
作者头像
高久峰
发布2023-06-03 11:37:32
1.8K0
发布2023-06-03 11:37:32
举报

mysqli提供了异步执行sql的功能,类似于select轮询机制。先提交SQL到预发布,再去轮询查询是否ok。query的时候加上MYSQLI_ASYNC选项,query就直接提交到mysql,但是本身不等待执行结果。mysqli不亏是加强版的mysql扩展,可惜不是pdo

<?php
/**
 * 执行SQL
 * @param $sql
 * @return mysqli
 */
function query($sql)
{
    // 1.创建连接
    $servername = "localhost";
    $username = "root";
    $password = "root";
    $database = "test";
    $conn = new mysqli($servername, $username, $password, $database);
    if ($conn->connect_error) {
        die("连接失败: " . $conn->connect_error);
    }

    // 2.异步提交SQL
    $conn->query($sql, MYSQLI_ASYNC);

    // 3.返回SQL连接
    return $conn;
}

// 1.保存全部的Conn变量
$all_conn = [];

// 2.循环提交异步SQL
$i = 4;
while ($i--) {
    $sql = "select scenes_name_cn from erp_allocation_scenes where id = $i";
    $all_conn [] = query($sql, MYSQLI_ASYNC);
}

// 3.循环等待全部的结果
$allResult = [];
do {
    $links = $errors = $reject = $all_conn;
    if (!mysqli_poll($links, $errors, $reject, 1)) {
        continue;
    }
    foreach ($all_conn as $conn) {
        if ($result = $conn->reap_async_query()) {
            $allResult[] = $result->fetch_row();
            if (is_object($result)) {
                $result->free();
            }
        } else {
            throw new mysqli_sql_exception(sprintf("MySQLi Error: %s", mysqli_error($conn)));
        }
    }
} while (count($allResult) == 5);

// 4.输出查询结果
print_r($allResult);

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档