";没有到主机的路由”;(HY000/2002)mysqli在远程服务器上不时出错-除了联系主机,我还能做什么


"No route to host" (HY000/2002) mysqli error on a remote server every now and then - what can I do besides contacting the host?

我不时会收到以下错误:Warning: mysqli_connect(): (HY000/2002): No route to host in(指向我的mysqli_connect的路径)。我的网站位于我的网络主机拥有的远程服务器上,所以问题可能在他们这边,但在指责他们造成这样的错误之前,我想确保这不是我的错。事实上,我认为这是我的错,原因有几个:

  • 托管公司是我国最受欢迎的公司之一,但谷歌搜索HY000/2002及其名称时仍然没有发现任何相关信息。似乎其他人对他们没有这个问题
  • 我第一次遇到这个问题是在我之前的代码(php、mysql、一些javascript片段)发生重大更改之后。这可能只是一个巧合,但更可能不是
  • 如果是服务器故障,我预计连接会崩溃并保持一段时间。然而,每次出现这样的错误后,我都可以重新加载页面,问题就结束了。。。再装几次

我发现的模式是,在运行mysqli_connect时,有一定(~1%)的机会触发错误每个使用数据库的函数都有自己的db.php文件(数据库初始化的地方),因此调用大量嵌套数据库调用函数的代码部分是非常危险的(高达10%的重新加载将导致崩溃),而那些在没有函数调用的情况下完成所有查询的代码是"安全的"。

我能想出一些将崩溃概率降至最低的解决方案,但它们并不能解决主要问题:mysqli_connect有时会失败,我不知道为什么,也不知道是什么触发了它

在我第一次遇到这个问题之前,我改变了什么:

  • 我把我的大部分mysqli查询都变成了准备好的语句。很少有函数是通用的——如果我想给它们提供可参数化的参数,而不是自定义的SQL代码块,我必须将它们拆分为10多个其他函数。我知道保留非参数化查询是一种糟糕的做法,但我确保我清除了可能进入函数的每一个内容,所以将它们更改为100%安全的参数化查询似乎是一项小的优先任务。除非它以某种方式导致了问题——我这样想了一段时间,因为我的"mysqli_query"函数往往在我的网站中最"危险"的部分被调用
  • 从静态升级到JavaScript谷歌地图API
  • 对数据库中的表进行了一些更改,但不对数据库本身进行了更改
  • 清理.htaccess文件(之前我出于测试原因禁止缓存-在现场没有原因)

这是我的db.php文件,和问题开始前一样(密码不是真的):

<?php
  $spojeni=mysqli_connect('mysql01','pavel','mypasswd');
  if (!$spojeni) die('Nepodařilo se připojit k databázi.');
  mysqli_query($spojeni, "USE ehistory");
  mysqli_set_charset($spojeni,'utf8');
  mysqli_query($spojeni, "SET COLLATION_CONNECTION = 'utf8_czech_ci';");
?>

我不能在这里发布整个网站(甚至所有查询),所以请评论并询问您是否认为我的代码的某些部分应该很重要;在这种情况下,添加解释为什么它可能很重要。

编辑:我问了我的网络主机,收到了应该替换为"mysql01"的IP地址。我用IP地址替换了"mysqli01",但没有任何变化。我还能做什么?

我的网站位于我的网络主机拥有的远程服务器上,因此问题可能是站在他们一边的,但在指责他们造成这种情况之前错误,我想确定这不是我的错。事实上,我希望它是我的错,有几个原因:

mysql01不是完全限定的域名(FQDN)请使用IP或向您的web主机询问更正的FQDN。

这似乎是一个IP路由问题(网络层3)。我认为,您需要检查的唯一一件事是,每次是否向mysqli_connect()提供了正确的MySQL服务器IP/主机名。要消除最终的冲突解决程序问题,请尝试使用纯IP而不是主机名。