2012-10-12 78 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

谢谢,@凯尔。这是对这种情况的一个很好的解释。 –