【问题标题】:PHP MySQLi Asynchronous Queries withPHP MySQLi 异步查询与
【发布时间】:2012-10-03 16:47:54
【问题描述】:

我正在尝试通过 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 和查询 3 不返回任何结果集。

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

【问题讨论】:

    标签: php mysql mysqli


    【解决方案1】:

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

    在您的示例中,$query_1 是同步的,因此在它返回并分配给$mysqli_stmt_obj 时已完全完成。 $query_2$mysqli_handle上异步启动成功,不等待结果就返回。当脚本到达$query_3 时,它仍有待处理的结果等待$query_2。因此,它会在完成最后一个查询之前尝试发送另一个查询,从而给您“命令不同步”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-23
      • 2015-05-05
      • 1970-01-01
      • 2013-05-02
      • 2014-05-21
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      相关资源
      最近更新 更多