2013-07-26 9 views
5

In Abwesenheit von Dokumentation beyond a function prototype Ich bin schwer zu finden, was der dritte Parameter für die Funktion mysqli_poll() ist.mysqli_poll() - Was ist der dritte Parameter für?

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

Mit Blick auf dem (C) Quellcode, scheint es die $ ablehnen Array mit Ressourcen zu füllen, wo ...

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

bedeutet dies, dass die Verbindung zum Server wird heruntergefahren/Herunterfahren?

Etwas anderes?

Sollte es mit den Ressourcen vorbelegt sein, um auf Unterbrechung zu prüfen? Oder werden sie automatisch von $ read und $ error hinzugefügt?

+0

Merkwürdig ist, dass die Namen der Parameter in der Quelle von den in der Dokumentation: https: // github.com/php/php-src/blob/master/ext/mysqli/mysqli_nonapi.c#L770 – Blender

+0

Überprüfen Sie diese Antwort. http://stackoverflow.com/questions/32575987/how-does-mysqli-poll-work Die Antworten unten sind nicht ganz genau, denke ich, aber ich verstehe es nicht gut genug, um sie zu korrigieren. Posting diesen Kommentar 3 Jahre später, weil dies ein sehr begrenztes Interesse ist, und dieser Thread ist sehr nützlich, um dieses Thema zu verstehen. –

Antwort

0

ich ein Prüfstand gebaut:

$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); 
} 

Ergebnisse (Annotationen mit // Präfix):

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 

dh $ mit Links bevölkerten reject wird immer, wo die Ergebnisse geerntet wurden, keine Links die noch nicht abrufbereit sind.

Der Versuch, mit mit einer ungültigen Verbindung wird der Wert aus allen Arrays entfernt (nicht zu $ ​​hinzugefügt ablehnen),

3

Die Arrays auf die select() Systemaufruf gebunden sind.

Wie Sie sehen hier: http://lxr.php.net/xref/PHP_5_5/ext/mysqlnd/mysqlnd.c#1384

Also, ja, nach select(2) Mann Dokumentation:

Select() untersucht die E/A-Deskriptormengen, deren Adressen in readfds weitergegeben, writefds und Errordefs, um zu sehen, ob einige ihrer Deskriptoren zum Lesen bereit sind, zum Schreiben bereit sind oder eine Ausnahmebedingung aussteht.

(writefds ist hier nicht wichtig, es bei der Umsetzung ignoriert)

Die $read oder $error Arrays leer sein darf, wenn der andere mit mysqli Objekten gefüllt ist.

$read muss ein Array mit mysqli Objekten sein, die Sie wollen Umfrage.

$error muss ein Array mit mysqli-Objekten sein, die Sie möchten überprüfen Sie für außergewöhnliche Daten.

Wie Sie aus http://lxr.php.net/xref/PHP_5_5/ext/mysqlnd/mysqlnd_enum_n_def.h#322 und http://lxr.php.net/xref/PHP_5_5/ext/mysqlnd/mysqlnd.c#1228 sehen, alles, was nicht <= CONN_READY || == CONN_QUIT_SENT überein impliziert CONN_QUERY_SENT, CONN_SENDING_LOAD_DATA, CONN_FETCHING_DATA, CONN_NEXT_RESULT_PENDING (dh Daten noch nicht bereit ist, geholt zu werden; Namen selbsterklärend sein sollte), werden nicht in den Bereitschafts Array hinzugefügt == wird sein $rejected:

$rejected kann alles sein, wenn Sie es an die Funktion übergeben; Es wird mit einem Array mit den Einträgen in $read überschrieben, die noch nicht zum Lesen bereit sind.

+1

@symcbean hmm. bemerkte zu spät, dass ich die Frage zunächst nicht vollständig beantwortete. Hatte bearbeitet. Aber ich habe auch die anderen beiden Parameter für Fragen und Antworten eingefügt, wenn jemand anderes über die unvollständigen Dokumente stolpert und danach sucht. – bwoebi

Verwandte Themen