MysqlndUhConnection::reapQuery

(PECL mysqlnd-uh >= 1.0.0-alpha)

MysqlndUhConnection::reapQueryGet result from async query

説明

public MysqlndUhConnection::reapQuery ( mysqlnd_connection $connection ) : bool

Get result from async query.

パラメータ

connection

Mysqlnd connection handle. Do not modify!

返り値

Returns TRUE on success. Otherwise, returns FALSE

例1 MysqlndUhConnection::reapQuery() example

<?php
class proxy extends MysqlndUhConnection {
 public function 
reapQuery($res) {
  
printf("%s(%s)\n"__METHOD__var_export(func_get_args(), true));
  
$ret parent::reapQuery($res);
  
printf("%s returns %s\n"__METHOD__var_export($rettrue));
  return 
$ret;
 }
}
mysqlnd_uh_set_connection_proxy(new proxy());

$conn1 = new mysqli("localhost""root""""test");
$conn2 = new mysqli("localhost""root""""test");

$conn1->query("SELECT 1 as 'one', SLEEP(1) AS _sleep FROM DUAL"MYSQLI_ASYNC |  MYSQLI_USE_RESULT);
$conn2->query("SELECT 1.1 as 'one dot one' FROM DUAL"MYSQLI_ASYNC |  MYSQLI_USE_RESULT);

$links = array(
 
$conn1->thread_id => array('link' => $conn1'processed' => false),
 
$conn2->thread_id => array('link' => $conn2'processed' => false)
);

$saved_errors = array();
do {
 
$poll_links $poll_errors $poll_reject = array();
 foreach (
$links as $thread_id => $link) {
  if (!
$link['processed']) {
   
$poll_links[] = $link['link'];
   
$poll_errors[] = $link['link'];
   
$poll_reject[] = $link['link'];
  }
 }
 if (
== count($poll_links))
  break;

 if (
== ($num_ready mysqli_poll($poll_links$poll_errors$poll_reject0200000)))
  continue;

 if (!empty(
$poll_errors)) {
  die(
var_dump($poll_errors));
 }

 foreach (
$poll_links as $link) {
  
$thread_id mysqli_thread_id($link);
  
$links[$thread_id]['processed'] = true;

  if (
is_object($res mysqli_reap_async_query($link))) {
   
// result set object
   
while ($row mysqli_fetch_assoc($res)) {
    
// eat up all results
    
var_dump($row);
   }
   
mysqli_free_result($res);
  } else {
   
// either there is no result (no SELECT) or there is an error
   
if (mysqli_errno($link) > 0) {
    
$saved_errors[$thread_id] = mysqli_errno($link);
    
printf("'%s' caused %d\n"$links[$thread_id]['query'],     mysqli_errno($link));
   }
  }
 }
} while (
true);
?>

上の例の出力は以下となります。

proxy::reapQuery(array (
  0 => NULL,
))
proxy::reapQuery returns true
array(1) {
  ["one dot one"]=>
  string(3) "1.1"
}
proxy::reapQuery(array (
  0 => NULL,
))
proxy::reapQuery returns true
array(2) {
  ["one"]=>
  string(1) "1"
  ["_sleep"]=>
  string(1) "0"
}

参考