PHP MYSQLI_ASYNC 插入查询并继续

PHP MYSQLI_ASYNC Insert Query and continue

提问人:Sergeant 提问时间:4/24/2018 更新时间:10/16/2019 访问量:1555

问:

有没有办法在PHP7.2脚本中使用后继续

$sql = "INSERT INTO `table` SET `a` = 'aaa';
$result = mysqli_query($link,$sql,MYSQLI_ASYNC);
// $result is always 'true'

作为延迟插入的一种手段?

它现在给出我的脚本何时继续并执行下一个查询。Commands out of sync; you can't run this command now

我正在使用 innodb,所以 an 不起作用,尽管我从 PHP 脚本的角度寻找相同的行为。(部署查询,不要等待它被处理)INSERT DELAYED

我是否需要使用单独的脚本和消息代理(例如 RabbitMQ)来使用 InnoDB 数据库来实现这一点?

php mysqli mariadb php-7.2

评论


答:

-3赞 Rick James 5/17/2018 #1

没有充分的理由异步运行;它可能非常快。INSERT

同上 或 ,除非有数百万行被更新或删除。UPDATEDELETE

评论

1赞 Sergeant 5/18/2018
有一个很好的理由,当你有一个具有主-主设置的复制后端时,插入行时会有一个小的延迟,因为它可以确保所有数据库都同步。我不希望我的 php 脚本等待它,因为我对查询的结果不感兴趣。
0赞 Rick James 5/18/2018
@Sergeant - 你真的是指大师-大师吗?如果是这样,则该配置不是同步的。“半同步”可能有问题;如果节点在地理上分散开来,Galera可能会有问题。
-2赞 Anse 10/16/2019 #2

是的,会立即从 返回。MYSQLI_ASYNCmysqli_query()

但是,当您运行下一个查询时,MySQL/MariaDB 会话可能仍然繁忙,这将为您提供“命令不同步”错误。

所以,你必须关心

  • 在运行进一步查询之前等待(未知)时间
  • 在异步查询完成之前不调用该会话,否则连接 barfsmysqli_close()
  • 甚至不让PHP脚本结束,因为据我所知,这隐含地调用。mysqli_close()

结论是:不要使用 ,除非您处于一个非常不常见的环境中,该环境使用多个并行连接,从不让连接结束,并且不会在同一会话上触发进一步的查询。MYSQLI_ASYNC