我试图通过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);
}
Run Code Online (Sandbox Code Playgroud)
对Query 1的调用通过OK.对查询2的调用也通过了OK.
但是,当我尝试执行查询3和查询4时,我得到"命令不同步;您现在无法运行此命令"错误.在我的在线研究中,我发现了一些使用mysqli_free_result但查询2和查询3返回的信息没有结果集.
我需要做些什么来正确完成异步调用,以便我可以进行多次调用而不会出现此错误?
小智 18
一个老问题,但我之前遇到过这个问题,并希望尽可能提供帮助.
不幸的是,mysqli文档相当缺乏,特别是在这方面.问题是'async'模式是mysql客户端行为,而不是客户端/服务器协议的一部分.也就是说,在给定时间,您仍然只能在连接上运行一个查询(或多个查询).MYSQLI_ASYNC仅指定应用程序在等待查询结果时不应阻止.之后必须使用mysqli_poll收集结果.
在您的示例中,$ query_1是同步的,因此完全由它返回并分配给$ mysqli_stmt_obj完成.$ query_2在$ mysqli_handle上成功异步启动,并返回而不等待结果.当脚本到达$ query_3时,它仍然有等待$ query_2的挂起结果.因此,它会尝试在完成最后一个查询之前发送另一个查询,从而使"命令不同步".
| 归档时间: |
|
| 查看次数: |
6371 次 |
| 最近记录: |