SQLSTATE [HY000] [2002]连接超时

问题描述:

得到这个在我的错误日志飘飞,想弄清楚这个问题:SQLSTATE [HY000] [2002]连接超时

[04-Oct-2014 13:25:42 America/Chicago] Failed to connect to database: SQLSTATE[HY000] [2002] Connection timed out [04-Oct-2014 13:25:42 America/Chicago] PHP Fatal error: Call to a member function prepare() on a non-object in /home/spconlin/public_html/spc_app/app/add_log.php on line 28

连接脚本:

<?php 

if(!defined('INCLUDE_CHECK')) die('You are not allowed to execute this file directly'); 

// db config 
$db_host  = '127.0.0.1'; 
$db_database = '*****'; 
$db_user  = '*****'; 
$db_pass  = '*****'; 

//db connection 
try { 
    $db = new PDO("mysql:host=$db_host;dbname=$db_database;charset=utf8", $db_user, $db_pass, 
     array(
      PDO::ATTR_EMULATE_PREPARES => false, 
      PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, //PDO::ERRMODE_SILENT is default setting 
      PDO::ATTR_PERSISTENT => false 
      ) 
    ); 
} 
catch(PDOException $e) { 
    error_log("Failed to connect to database: ".$e->getMessage()); 
} 

?> 

我做了什么:

  • 从'lo calhost”为127.0.0.1的连接
  • 开关持久连接到假

之前做上述变化,以我的连接如上图所示我得到SQLSTATE[HY000] [2002] Resource temporarily unavailable而非connection timed out

一些背景信息 - 特别是这个add_log.php脚本在实际使用时将信息添加到数据库,每秒最多几次。虽然差不多99%的时间这个特定的脚本在错误中被引用,但有时候其他脚本也是如此。我意识到脚本指向真的并不意味着什么,因为这不是错误发生的地方(它发生在连接而不是add_log.php脚本中),但它很奇怪,它几乎总是引用这个特定的文件,导致我相信这个问题经常被相继提出是这个问题的一部分。

DB是innodb。

这实际上是我的服务器和数据库或连接到它的人/计算机的问题?是否可能'他们'与'我'有不良联系,这是什么原因导致错误?

编辑:

难道是在我需要我的网页上的连接脚本需要它的方式?由于该文件经常被“击中”,它也会要求我的连接脚本与下面的行一样多。请注意,我正在使用$_SERVER['DOCUMENT_ROOT'](可能有影响?)。

require $_SERVER['DOCUMENT_ROOT'].'/custom/functions/connect.php';

+0

你能用客户端登录到你的数据库吗?没有PHP?通常这是一个MySQL资源问题 – 2014-10-05 02:17:52

+0

什么行代码是在add_log.php行28?它似乎并不是你所包含的代码的一部分。 – mschuett 2014-10-05 04:24:20

+0

它与op中提到的不相关。错误发生在连接中,然后在下次使用$ db时触发。脚本没有“错误” - 它们工作正常 - 我无法自己复制此错误,并且它不会一直发生。 – user756659 2014-10-05 16:25:09

你应该在代码中改进的事情是在创建新代码之前检查连接。

您应该设法尽可能重用连接,而不是重新创建不必要的连接。

当太多的连接打开时,你会遇到像这样的错误,并且它不会很明显地被重现。

此外,当连接不成功时,您应该在准备之前退出。

此更改可能需要您在类的内部实现该逻辑。

+0

你可以在此扩展吗?我正在使用pdo。原本我打开了持续的连接......我现在已经关闭了。其次,在pdo中,脚本结束时会自动关闭连接。所以,唯一打开的连接就是应该打开的连接。 – user756659 2014-10-06 04:15:35

+0

如果有什么'ATTR_PERSISTENT'应该设置为true – meda 2014-10-06 04:16:44

+0

这是我原来的 - 当这是我仍然得到相同的错误,但他们是'SQLSTATE [HY000] [2002]资源暂时不可用' – user756659 2014-10-06 04:19:01