ConFoo Montreal 2017 Calling for Papers

mysqli::poll

mysqli_poll

(PHP 5 >= 5.3.0, PHP 7)

mysqli::poll -- mysqli_pollAlmacena en caché conexiones

Descripción

Estilo orientado a objetos

public static int mysqli::poll ( array &$read , array &$error , array &$reject , int $sec [, int $usec ] )

Estilo por procedimientos

int mysqli_poll ( array &$read , array &$error , array &$reject , int $sec [, int $usec ] )

Almacena en caché conexiones. Disponible sólo con mysqlnd. Este método puede usarse como estático.

Parámetros

read

Lista de conexiones a comprobar para resultados pendientes que se pueden leer.

error

Lista de conexiones en las que ocurrió un error, por ejemplo, fallo de consulta o conexión perdida.

reject

Lista de conexiones rechazadas debido a que no se ha ejecutado ninguna consulta asíncrona para la que la función podría almacenar en caché resultados.

sec

El número de segundos a esperar, debe ser no negativo.

usec

El número de microsegundos a esperar, debe ser no negativo.

Valores devueltos

Devuelve el número de conexiones si tiene éxito, FALSE de otro modo.

Ejemplos

Ejemplo #1 Un ejemplo de mysqli_poll()

<?php
$enlace1 
mysqli_connect();
$enlace1->query("SELECT 'test'"MYSQLI_ASYNC);
$todos_los_enlaces = array($enlace1);
$procesado 0;
do {
    
$enlaces $errores $rechazados = array();
    foreach (
$todos_los_enlaces as $enlace) {
        
$enlaces[] = $errores[] = $rechazados[] = $enlace;
    }
    if (!
mysqli_poll($enlaces$errores$rechazados1)) {
        continue;
    }
    foreach (
$enlaces as $enlace) {
        if (
$resultado $enlace->reap_async_query()) {
            
print_r($resultado->fetch_row());
            if (
is_object($resultado))
                
mysqli_free_result($resultado);
        } else die(
sprintf("MySQLi Error: %s"mysqli_error($enlace1)));
        
$procesado++;
    }
} while (
$procesado count($todos_los_enlaces));
?>

El resultado del ejemplo sería:

Array
(
    [0] => test
)

Ver también

add a note add a note

User Contributed Notes 2 notes

up
0
shestero at meta dot ua
7 months ago
Sometime it's not clear what does it mean as connection is "ready" . Does it mean the query completed or just some records ready to read?
Is it possible to use asynchronous (unblocking) and unbuffered SELECT-query? I.e. with both MYSQLI_ASYNC|MYSQLI_USE_RESULT

I want some poll-like code inside my loop that has four case-options:
1. Poll wait time-out is over but no records of result set is ready.
2. One or more records are ready to read (but the query still running).
3. Query is successfully over (completed; no more records).
4. Error.

Is it possible?

As I understood the operation of reading a record from unbuffered query is blocking if there are no ready records at the moment, and there is no functions to get out how much records are ready ?
up
0
l_sanczyk at hotmail dot com
2 years ago
You can use the following code to execute, for example, 10 simultaneous queries:

$query = "SELECT `field1`, `field2` FROM `table` WHERE `field1`='something'";

$all_links = array();
for($i=0; $i<10; $i++) {
    $link = mysqli_connect("your.mysql.server.here","your@user","pa$$w0rd",DataBase_Name");
    $link->query($query, MYSQLI_ASYNC);
    $all_links[] = $link;
}

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

NOTE: If you get a "Warning: mysqli::query() expects parameter 2 to be long, string given" you have a mysqlnd installation or configuration issue.
To Top