2013-07-26 7 views
5

W przypadku braku jakiejkolwiek dokumentacji beyond a function prototype staram się znaleźć trzeci parametr funkcji mysqli_poll().mysqli_poll() - jaki jest trzeci parametr?

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

Patrząc na (C) kodu źródłowego, wydaje się, aby wypełnić tablicę $ Odrzucanie z zasobów tam, ...

CONN_GET_STATE((*p)->data) <= CONN_READY 
    || CONN_GET_STATE((*p)->data) == CONN_QUIT_SENT 

Czy oznacza to, że połączenie z serwerem jest zamykany/zamknąć?

Coś jeszcze?

Czy należy go wstępnie zalać zasobami, aby sprawdzić, czy nie nastąpił rozłączenie? Czy będą one automatycznie dodawane z $ read i $ error?

+0

dziwne, nazwy parametrów źródła różnią się od tych w dokumentach: https: // github.com/php/php-src/blob/master/ext/mysqli/mysqli_nonapi.c#L770 – Blender

+0

Sprawdź tę odpowiedź. http://stackoverflow.com/questions/32575987/how-does-mysqli-poll-work Poniższe odpowiedzi nie są całkiem dokładne, ale nie rozumiem ich wystarczająco dobrze, aby je poprawić. Zamieszczanie tego komentarza 3 lata później, ponieważ jest to bardzo ograniczony przedmiot zainteresowania, a ten wątek jest bardzo przydatny do zrozumienia tego tematu. –

Odpowiedz

0

I zbudował platformę testową:

$l1 = mysqli_connect(); 
$l2 = mysqli_connect(); 
$l3 = mysqli_connect(); 

$s1 = "SELECT CURTIME()"; 
$s2 = "SELECT * FROM"; // will error #1064 
$s3 = "SELECT SLEEP(10), CURTIME()"; 

mysqli_query($l1, $s1, MYSQLI_ASYNC); 
mysqli_query($l2, $s2, MYSQLI_ASYNC); 
mysqli_query($l3, $s3, MYSQLI_ASYNC); 

$started=time(); 

for ($x=0; $x<5; $x++) { 
     $ready=$reject=$errors = array($l1, $l2, $l3); 
     print "\niteration $x at t+" . (time()-$started) . "\n"; 
     mysqli_poll($ready, $errors, $reject, 3); 
     print "ready = " . count($ready) . "\n"; 
     foreach($ready as $r) { 
      $c=mysqli_reap_async_query($r); 
      print "err=" . mysqli_error($r) . " cnt=" . count($c) . "\n"; 
     }; 
     print "errors = " . count($errors) . "\n"; 
     print "reject = " . count($reject) . "\n"; 
     sleep(4); 
} 

Wyniki (adnotacji z przedrostkiem //):

iteration 0 at t+0 
ready = 1    // appears to be SELECT CURTIME() 
err= cnt=1 
errors = 0 
reject = 0 

iteration 1 at t+4 
ready = 1    // appears to be SELECT * FROM 
err=You have an error in your SQL syntax; check the manual that corresponds 
    to your MySQL server version for the right syntax to use near '' at line 
    1 cnt=1 
errors = 0 
reject = 1    // appears to be SELECT CURTIME() (results reaped) 

iteration 2 at t+8 
ready = 1    // appears to be SELECT SLEEP(10) despite 8 seconds elapsed 
err= cnt=1 
errors = 0 
reject = 2    // appears to be SELECT CURTIME() + SELECT * FROM 

iteration 3 at t+14 
ready = 0 
errors = 0 
reject = 3 

iteration 4 at t+21 
ready = 0 
errors = 0 
reject = 3 

czyli $ odrzucić jest uzyskiwanie zaludnionych z linkami których wyniki zostały odnieść, NOT linki które nie są jeszcze gotowe do głosowania.

Próba ze związku z nieprawidłową wartość usuwa się ze wszystkich tablic (nie dodaje się do $ odrzucić),

3

Macierze są związane z select() wywołania systemowego.

Jak widać tutaj: http://lxr.php.net/xref/PHP_5_5/ext/mysqlnd/mysqlnd.c#1384

Tak, tak, według select(2) dokumentacji Man:

select() sprawdzającej/O zbiorach deskryptorów I, których adresy są przekazywane w readfds, writefds i errorfds, aby sprawdzić, czy niektóre z ich deskryptorów są gotowe do czytania, czy są gotowe do napisania, czy też mają wyjątek.

(writefds nie jest tu istotne, to jest ignorowany w realizacji)

W $read lub $error tablice mogą być puste, jeśli druga jest wypełniona mysqli obiektów.

$read musi być tablicą z obiektami mysqli, które chcesz ankieta.

$error musi być tablicą z mysqli obiektów chcesz sprawdzania danych nadzwyczajnych.

Jak widać z http://lxr.php.net/xref/PHP_5_5/ext/mysqlnd/mysqlnd_enum_n_def.h#322 i http://lxr.php.net/xref/PHP_5_5/ext/mysqlnd/mysqlnd.c#1228 wszystko, co nie pasuje <= CONN_READY || == CONN_QUIT_SENT implikuje CONN_QUERY_SENT, CONN_SENDING_LOAD_DATA, CONN_FETCHING_DATA, CONN_NEXT_RESULT_PENDING (czyli danych nie jest jeszcze gotowy, aby być naciągane; nazwy powinny być self-wyjaśniając) nie zostaną dodane do gotowej tablicy == będzie $rejected:

$rejected może być cokolwiek, gdy przekażesz go do funkcji; zostanie nadpisany tablicą z wpisami w $read, które nie są jeszcze gotowe do odczytu.

+1

@symcbean hmm. zbyt późno zauważyłem, że początkowo nie udzieliłem pełnej odpowiedzi na to pytanie. Edytowałem. Ale uwzględniłem również dwa pozostałe parametry, w przypadku pytań i odpowiedzi, gdy ktoś inny natknie się na niekompletne dokumenty i wyszuka je. – bwoebi