是什么导致mysqli_poll函数的这个PHP警告?

时间:2018-02-21 20:11:06

标签: php mysql mysqli asyncsocket mysqlnd

我使用PHP的MySQL本机驱动程序进行从PHP应用程序到MySQL数据库的异步并行查询。

我有一个函数接收查询字符串数组并并行执行它们。

无论出于何种原因,在我使用此功能的特定环境中,以下PHP警告正在输出到Apache error_log

PHP Warning:  mysqli_poll(): Parameter 1 not a mysqli object

我的假设是,当mysqli_poll函数的第一个参数在数组中传递的一个或多个数据库连接变量不是有效的MySQLi对象时,会发生这种情况,但是查看我的代码,我不会# 39;了解它如何能够从一开始就达到这一点。

具体来说,这里是有问题的代码:

function makeAsyncQueries($queries) {

  $allLinks = [];
  $allLinkThreadIds = [];
  $allResults = [];

  foreach ($queries as $query) {

    $link = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME, DB_PORT);
    $result = mysqli_query($link, $query, MYSQLI_ASYNC);

    if ($result !== false) {
      $allLinks[] = $link;
      $allLinkThreadIds[] = mysqli_thread_id($link);
    } else {
      // Attempting to log. This condition is never met.
    }

  }

  $processed = 0;

  while ($processed < count($allLinks)) {

    $links = $errors = $reject = [];

    foreach ($allLinks as $link) {
      $links[] = $errors[] = $reject[] = $link;
    }

    if (mysqli_poll($links, $errors, $reject, 0, 0)) { // This causes the error.

      foreach ($links as $link) {

        if ($results = mysqli_reap_async_query($link)) {

          $idx = array_search(mysqli_thread_id($link), $allLinkThreadIds);

          if ($results !== false) {
            $allResults[$idx] = processDbResults($results); // Custom function
          } else {
            // Attempting to log. This condition is never met.
          }

          freeResults($link); // Custom function
          $processed++;

        }

      }

    }

  }

  ksort($allResults);
  return $allResults;

}

如果由于某种原因mysqli_query的结果无效,则$result变量应为false,对吗?但是if ($result !== false)的else部分永远不会得到满足,因此假设$result有效并且$link是一个有效的MySQLi对象是安全的吗?

如果情况确实如此,那我怎样才能从mysqli_poll函数调用中获得PHP警告?

任何有助于指导我误解某些内容的指针都会非常有用 感谢。

0 个答案:

没有答案