PHP MySQLi异步查询

PHP MySQLi异步查询,php,mysql,mysqli,Php,Mysql,Mysqli,我试图通过PHP MySQLi使用异步查询 下面的代码已经简化,原始的is代码过于冗长,无法在这里列出,因为类依赖性等等。另外,请假定已设置对连接mysqli\u句柄的引用 $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) UNSI

我试图通过PHP MySQLi使用异步查询

下面的代码已经简化,原始的is代码过于冗长,无法在这里列出,因为类依赖性等等。另外,请假定已设置对连接
mysqli\u句柄的引用

$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\u free\u result
的信息,但是查询2和查询3没有返回结果集


我需要做什么才能正确地完成异步调用,这样我就可以进行多次调用而不会出现此错误?

不幸的是,mysqli文档相当缺乏,尤其是在这方面。问题在于“异步”模式是mysql客户端行为,而不是客户端/服务器协议的一部分。也就是说,在给定的时间内,您仍然只能在一个连接上运行一个查询(或者我想是多个查询)
MYSQLI\u ASYNC
仅指定应用程序在等待查询结果时不应阻塞。结果必须在以后收集

在您的示例中,
$query\u 1
是同步的,因此当它返回并分配给
$mysqli\u stmt\u obj
时,它就完成了
$query_2
$mysqli_handle
上异步启动成功,并在不等待结果的情况下返回。当脚本到达
$query\u 3
时,它仍然有一个挂起的结果等待
$query\u 2
。因此,它试图在完成最后一个查询之前发送另一个查询,给您“命令不同步”