我建了一個試驗檯:
$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
即$拒絕是越來越與在結果已經收穫環節,不是鏈接填充尚未準備好投票。
與試圖與一個無效的連接,該值從所有陣列(未添加到$拒絕)除去,
奇怪的是,在源的參數的名稱不同於文檔中不同:https://開頭github.com/php/php-src/blob/master/ext/mysqli/mysqli_nonapi.c#L770 – Blender
看看這個答案。 http://stackoverflow.com/questions/32575987/how-does-mysqli-poll-work下面的答案不是很準確,我認爲,但我不明白它足以糾正它們。 3年後發表此評論是因爲這是一個非常有限的主題興趣,而且該主題對於理解此主題非常有用。 –