【问题标题】:Warning: mysqli::reap_async_query(): Connection not opened, clear or has been closed警告:mysqli::reap_async_query():连接未打开、清除或已关闭
【发布时间】:2018-06-21 05:30:57
【问题描述】:

我正在尝试使用异步查询进行一些测试。我得到了这个结果:

Array ( [0] => 2017-11-28 11:34:01 [1] => 50 )  
Warning: mysqli::reap_async_query(): Connection not opened, clear or has been closed in /var/www/testasync.php on line 24.

我无法在任何地方找到有关此警告的任何信息。直到我的代码结束时,我才会关闭我的连接。什么意思?

这是我的代码:

<?php    
$connect = mysqli_connect("localhost", "user", "password", "test");
if (!$connect) {
     die('Could not connect: ' . mysqli_error($connect));   
}

// Queries
$sql0 = "SELECT * FROM flow01 where datetime = (select min(datetime) from flow01)";
mysqli_query($connect, $sql0, MYSQLI_ASYNC);
$sql1 = "SELECT * FROM flow01 where datetime = (select max(datetime) from flow01)";
mysqli_query($connect, $sql1, MYSQLI_ASYNC);
$sql2 = "SELECT * FROM hum01 where datetime = (select min(datetime) from hum01)";
mysqli_query($connect, $sql2, MYSQLI_ASYNC);
$sql3 = "SELECT * FROM hum01 where datetime = (select max(datetime) from hum01)";
mysqli_query($connect, $sql3, MYSQLI_ASYNC);

// Results
$i = 0;
foreach ($connect as $result) {
    if ($result = $connect->reap_async_query()) {
        print_r($result->fetch_row());
        mysqli_free_result($result);
        $i++;
    }
}
mysqli_close($connect);
?>

【问题讨论】:

  • 不是我用过的东西,但这些例子似乎在获取结果之前使用了mysqli_poll (php.net/manual/en/mysqli.poll.php)。也许您必须等待结果准备好才能阅读它们。
  • 请参阅该链接中的示例 #4,了解如何执行多个并发查询。
  • 您对 mysqli_poll 的看法可能是正确的。我试图弄清楚。我会告诉你进展如何。
  • 谢谢你们!那行得通。我得到了很好的结果。我不知道如何将您的 cmets 标记为有用。是不是因为我的名声太低了?

标签: php mysql mysqli


【解决方案1】:

以防万一其他人来寻找答案,我将发布我使用 mysqli_poll 制作的代码。

<?php    
// Queries
$sql0 = "SELECT * FROM flow01 where datetime = (select min(datetime) from flow01)";
$sql1 = "SELECT * FROM flow01 where datetime = (select max(datetime) from flow01)";
$sql2 = "SELECT * FROM hum01 where datetime = (select min(datetime) from hum01)";
$sql3 = "SELECT * FROM hum01 where datetime = (select max(datetime) from hum01)";

$all_links = array();
for($i=0; $i<=3; $i++) {
    $connect = mysqli_connect("localhost", "user", "password", "test"); 
    mysqli_query($connect, ${'sql' . $i}, MYSQLI_ASYNC);
    $all_links[] = $connect;
}

$processed = 0;
do {
    $links = $errors = $reject = array();
    foreach ($all_links as $connect) {
        $links[] = $errors[] = $reject[] = $connect;
    }
    if (!mysqli_poll($links, $errors, $reject, 2)) {
        continue;
    }
    foreach ($links as $connect) {
        if ($result = $connect->reap_async_query()) {
            $new = $result->fetch_row();
            print_r($new);
            mysqli_free_result($result);
        } else die(sprintf("MySQLi Error: %s", mysqli_error($connect)));
        $processed++;
    }
} while ($processed < count($all_links));

mysqli_close($connect);
?>

这给出了以下结果:

Array ( [0] => 2017-11-28 11:34:29 [1] => 13 ) Array ( [0] => 2017-12-20 12:11:12 [1] => 12 ) Array ( [0] => 2018-01-12 06:37:10 [1] => 0 ) Array ( [0] => 2017-11-28 11:34:01 [1] => 50 ) 

编辑:它似乎以任何顺序提取结果,这意味着它们通常是无序的。我尝试在我的表中添加另一列,并用数字表示它是什么表,然后我可以在显示结果之前对结果进行排序。如果有人知道更好的方法,请告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-27
    • 2023-03-30
    • 2017-12-01
    • 2015-12-25
    • 1970-01-01
    • 2023-04-09
    • 2019-07-29
    • 2019-01-09
    相关资源
    最近更新 更多