2013-07-26 50 views
5

在沒有任何文檔beyond a function prototype我努力尋找什麼是mysqli_poll()函數的第三個參數。mysqli_poll() - 第三個參數是什麼?

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

綜觀(C)的源代碼,它似乎填充$拒絕與資源投入到陣列...

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

這是否意味着到服務器的連接被關閉/關掉?

還有其他的東西嗎?

是否應該預先使用資源來檢查斷開連接?或者將它們從$ read和$ error自動添加?

+0

奇怪的是,在源的參數的名稱不同於文檔中不同:https://開頭github.com/php/php-src/blob/master/ext/mysqli/mysqli_nonapi.c#L770 – Blender

+0

看看這個答案。 http://stackoverflow.com/questions/32575987/how-does-mysqli-poll-work下面的答案不是很準確,我認爲,但我不明白它足以糾正它們。 3年後發表此評論是因爲這是一個非常有限的主題興趣,而且該主題對於理解此主題非常有用。 –

回答

0

我建了一個試驗檯:

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

結果(前綴註釋//):

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 

即$拒絕是越來越與在結果已經收穫環節,不是鏈接填充尚未準備好投票。

與試圖與一個無效的連接,該值從所有陣列(未添加到$拒絕)除去,

3

的陣列被結合到選擇()系統調用。

正如你在這裏看到:http://lxr.php.net/xref/PHP_5_5/ext/mysqlnd/mysqlnd.c#1384

所以,是的,根據select(2)人文檔:

選擇()檢查I/O的描述符集,其地址在readfds,writefds和傳遞errorfds來查看它們的某些描述符是否準備好讀取,是否準備好寫入,或者有待處理的異常情況。

writefds在這裏並不重要,它是在執行忽略)

$read$error陣列允許如果對方是充滿mysqli的對象是空的。

$read必須是一個具有mysqli對象的數組,您要民意調查

$error必須是一個包含mysqli對象的數組,您需要檢查非常數據

當你從http://lxr.php.net/xref/PHP_5_5/ext/mysqlnd/mysqlnd_enum_n_def.h#322http://lxr.php.net/xref/PHP_5_5/ext/mysqlnd/mysqlnd.c#1228看到,一切不符合<= CONN_READY || == CONN_QUIT_SENT意味着CONN_QUERY_SENT, CONN_SENDING_LOAD_DATA, CONN_FETCHING_DATA, CONN_NEXT_RESULT_PENDING(即數據還沒有準備好要取;名稱應該是自我解釋)將不會被添加到陣列準備==將$rejected

$rejected可以是任何東西,當你把它傳遞給函數;它將被數組覆蓋,其中$read中的條目尚未準備好被讀取。

+1

@symcbean嗯。注意到太遲,我沒有完全回答這個問題。已編輯。但是我也包含了其他兩個參數,用於問答時,其他人會絆倒不完整的文檔並搜索它。 – bwoebi

相關問題