2012-10-12 106 views
7

我想通過PHP MySQLi使用異步查詢。PHP MySQLi異步查詢

下面的代碼已經被簡化了,原來代碼太冗長了,因爲類依賴關係和所有這些。還請假設已經設置了連接mysqli_handle的引用。

$query_1 = "SHOW TABLES FROM moxedo"; 
$query_2 = "CREATE TABLE `moxedo`.`mox_config_n85ad3` (`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT , `group_id` INT(3) UNSIGNED NOT NULL , `is_enabled` INT(1) UNSIGNED NOT NULL , `tag` VARCHAR(255) NOT NULL , `name` VARCHAR(80) NOT NULL , `value` VARCHAR(255) NOT NULL , `description` TEXT NOT NULL , `init_params` TEXT NOT NULL , `datetime_added` DATETIME NOT NULL , `datetime_lastmodified` DATETIME NOT NULL , `timestamp_univ` BIGINT(14) NOT NULL , PRIMARY KEY (`id`)) ENGINE = INNODB 
"; 
$query_3 = "ALTER TABLE `moxedo`.`mox_config_n85ad3` ADD UNIQUE `ix_u_tag_oq` (`tag`)"; 
$query_4 = "SHOW TABLES FROM moxedo"; 

if (!$mysqli_stmt_obj = $mysqli_handle->query($query_1)) 
{ 
    printf("Error: %s\n", $mysqli_handle->error); 
} 

if (!$mysqli_stmt_obj = $mysqli_handle->query($query_2, MYSQLI_ASYNC)) 
{ 
    printf("Error: %s\n", $mysqli_handle->error); 
} 

if (!$mysqli_stmt_obj = $mysqli_handle->query($query_3, MYSQLI_ASYNC)) 
{ 
    printf("Error: %s\n", $mysqli_handle->error); 
} 

if (!$mysqli_stmt_obj = $mysqli_handle->query($query_4)) 
{ 
    printf("Error: %s\n", $mysqli_handle->error); 
} 

對查詢1的調用通過OK。對查詢2的調用也會通過OK。

但是,當我嘗試執行查詢3和查詢4時,出現「命令不同步;現在無法運行此命令」錯誤。從我的在線研究中,我找到了一些關於使用mysqli_free_result但查詢2和Query 3不返回結果集。

我需要做些什麼才能正確完成異步調用,以便可以在不發生此錯誤的情況下進行多次調用?

回答

15

一個古老的問題,但我遇到過這種情況,並希望在可能的情況下提供幫助。

不幸的是,mysqli文檔相當缺乏,特別是在這方面。問題是「異步」模式是一種mysql客戶端行爲,而不是客戶端/服務器協議的一部分。也就是說,在給定時間內,您仍然只能在連接上運行一個查詢(或多個查詢,我想)。 MYSQLI_ASYNC僅指定您的應用程序在等待查詢結果時不應該阻塞。結果必須在mysqli_poll之後收集。

在你的例子中,$ query_1是同步的,所以完全按它返回的時間完成,並賦值給$ mysqli_stmt_obj。 $ query_2成功地在$ mysqli_handle上異步啓動,並且無需等待結果即可返回。在腳本進入$ query_3時,它仍然有一個等待$ query_2的掛起結果。因此,它會在完成最後一個查詢之前嘗試發送另一個查詢,導致「命令不同步」。

+0

謝謝凱爾。非常感激。我不確定是否早些時候明白了這一點,但它可能會在稍後爲我[和其他人希望]派上用場。乾杯。 –

+0

謝謝,@凱爾。這是對這種情況的一個很好的解釋。 –