【问题标题】:mysqli_ping breaks mysqli_multi_querymysqli_ping 中断 mysqli_multi_query
【发布时间】:2012-08-31 16:01:53
【问题描述】:

我有一个很好的函数,叫做 lnk(),我已经使用了很长时间,它可以连接到 MySQL。 最近我决定添加 mysqli_ping 调用来检查连接并在需要时重新连接,因为我遇到了一个守护进程(24/7 运行)的问题,该守护进程在长时间不活动后不断失去与 MySQL 的连接。

实施后,我开始遇到多查询问题。 如果在 mysqli_multi_query 之后发送 ping,则在发送 ping 时与 MySQL 的连接丢失,除非 mysqli_store_result 在 ping 之前。

$mq = mysqli_multi_query(lnk(), "SHOW PROCESSLIST;");
mysqli_next_result(lnk());
$result = mysqli_store_result(lnk());
while($row = mysqli_fetch_row($result)) {
  print_r($row);
}

知道为什么会这样吗?

请不要建议在库中添加变量以在这些情况下忽略连接检查。我已经想到了,这还不够好。我需要确切地知道为什么会发生这种情况以及在这种情况下 ping 对我的连接有什么影响。

【问题讨论】:

  • 您可能需要在各种调用中重复使用相同的$link。如果mysqli_multi_query 和其他人之间的连接被重置,lnk() 会给你一个新的链接......这反过来又会破坏mysqli_next_result
  • 中断发生在 ping 而不是 next_result。
  • 不管怎样,我认为您应该在各种函数中重复使用相同的链接值。
  • 正如我所提到的,我添加了一个选项来绕过函数中的 ping。这意味着该函数只是完全按照您提到的那样返回连接。我不需要解决方案来使其工作。正如我提到的,我已经拥有它。我需要一个答案,为什么会这样。 ping 到底在做什么?

标签: php mysqli mysqli-multi-query


【解决方案1】:

幕后:

...这似乎会删除您的结果。

这意味着您应该只重新连接一次(在调用 multi_query 之前)。像这样的:

$link = lnk(); //once
$mq = mysqli_multi_query($link, "SHOW PROCESSLIST;");
mysqli_next_result($link);
$result = mysqli_store_result($link);
while($row = mysqli_fetch_row($result)) {
  print_r($row);
}

【讨论】:

  • 你读过斜体字吗?我有一个参数传递给绕过连接验证,它工作得很好。仅在非多查询的其他情况下才调用 ping。我的问题不是我不知道如何使代码工作。我的问题是为什么在多查询的情况下 ping 会这样做? ping 实际上不是 ping 吗?喜欢特定的命令?
  • 对不起,我通过“参数”假设它默认为“执行 ping”。 (不过,明确地重复使用相同的链接并没有什么坏处)。文档说ping 可能会为您自动重新连接——尽管我认为这里不会发生这种情况,因为您的多查询是成功的(对吗?)。 IIRC,您不能在 PDO 中同时打开多个语句。 ping 可能在幕后做了类似 SELECT 1 的事情,这可能会导致多查询爆炸。
  • 我也这么认为,但有人知道吗?或者在不发送命令的情况下检查连接的替代方法?我不使用 ping 重新连接,而是在无限控制循环中检查连接,该循环在每个设定的时间间隔执行一些操作。
  • 我没有看到任何像 SELECT 1 这样令人讨厌的东西,但它似乎正在丢弃任何有效结果:github.com/php/php-src/blob/master/ext/mysql/php_mysql.c#L381
猜你喜欢
  • 2017-06-13
  • 2017-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-26
  • 2018-07-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多