mysqli_poll în PHP

mysqli avansat PHP 5.3+

Așteaptă până când una sau mai multe interogări asincrone au răspuns gata, pe conexiuni diferite.

Sintaxă
mysqli_poll(?array &$read, ?array &$error, array &$reject, int $seconds, int $microseconds = 0): int|false

Ce face mysqli_poll

Dai trei tablouri cu conexiuni (de obicei aceeași listă în toate) și un timp maxim de așteptare. La întoarcere, $read conține doar conexiunile care au rezultatul gata, $error pe cele cu erori, iar $reject pe cele fără interogare asincronă în desfășurare. Funcția returnează numărul de conexiuni gata.

Exemplele de pe această pagină folosesc baza de date magazin, cu tabelul produse (coloanele id INT AUTO_INCREMENT, nume VARCHAR(100) NOT NULL, pret INT și stoc INT) și patru rânduri: Laptop (3200 lei, 5 buc.), Mouse (80 lei, 40 buc.), Monitor (900 lei, 0 buc.) și Tastatură (150 lei, 12 buc.). Comenzile SQL sunt explicate în secțiunea MySQL. Rezultatele au fost scrise pentru MySQL 8, pentru că exemplele au nevoie de un server de baze de date.

Parametri

Parametru Descriere
$read Conexiunile urmărite; la final rămân cele cu rezultat gata.
$error Conexiunile urmărite pentru erori.
$reject La final: conexiunile respinse.
$seconds Câte secunde să aștepte cel mult.
$microseconds Opțional. Microsecunde în plus.

Ce returnează

Numărul de conexiuni gata sau false la eroare.

Exemple

Exemplul 1: Două interogări în paralel

<?php
$a = mysqli_connect("localhost", "ana", "parola_ta", "magazin");
$b = mysqli_connect("localhost", "ana", "parola_ta", "magazin");

mysqli_query($a, "SELECT 'stoc', SUM(stoc) FROM produse", MYSQLI_ASYNC);
mysqli_query($b, "SELECT 'valoare', SUM(pret * stoc) FROM produse", MYSQLI_ASYNC);

$inAsteptare = [$a, $b];
while ($inAsteptare) {
    $citite = $erori = $respinse = $inAsteptare;
    if (mysqli_poll($citite, $erori, $respinse, 2) < 1) {
        continue;
    }
    foreach ($citite as $conn) {
        [$ce, $valoare] = mysqli_fetch_row(mysqli_reap_async_query($conn));
        echo "$ce: $valoare\n";
        $inAsteptare = array_filter($inAsteptare, fn($c) => $c !== $conn);
    }
}

Rezultat posibil (ordinea depinde de care interogare termină prima)

stoc: 57
valoare: 21000

Greșeli frecvente

  • Refolosești aceleași tablouri după apel. mysqli_poll le modifică; reconstruiește-le înainte de fiecare apel, ca în exemplu.

Comenzi înrudite

  • mysqli_reap_async_query: Preia rezultatul unei interogări trimise asincron cu mysqli_query(…, MYSQLI_ASYNC).
  • mysqli_query: Trimite o interogare SQL către baza de date. Pentru SELECT returnează un rezultat din care citești rândurile.