SQLSTATE [HY000] [2002]连接超时

时间:2014-10-05 01:05:36

标签: php mysql pdo

偶尔在我的错误日志中记录此问题并想要找出问题:

  

[04-Oct-2014 13:25:42 America / Chicago]无法连接到数据库:   SQLSTATE [HY000] [2002]连接超时[2014年10月4日13:25:42   America / Chicago] PHP致命错误:调用成员函数prepare()   在/home/spconlin/public_html/spc_app/app/add_log.php中的非对象上   在第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());
}

?>

我做了什么:

  • 从&#39; localhost&#39;切换到连接中的127.0.0.1
  • 将持久连接切换为false

在对我的连接进行上述更改之前,我收到了SQLSTATE[HY000] [2002] Resource temporarily unavailable而不是connection timed out,如上所示。

一些背景信息 - 特别是这个add_log.php脚本在实际使用时每秒向数据库添加几次信息。虽然有几乎99%的时间在错误中引用此特定脚本,但有时其他脚本也是如此。我意识到脚本指向的确没有任何意义,因为这不是发生错误的地方(它发生在连接而不是add_log.php脚本中),但奇怪的是它几乎总是这个引用我的特定文件相信它经常被连续调用的事实是问题的一部分。

DB是innodb。

这实际上是我的服务器和数据库或连接到它的人/计算机的问题吗?是否有可能&#39;他们&#39;和我的关系很糟糕这是导致错误的原因吗?

编辑:

可能是我需要在需要的页面上连接脚本的方式吗?由于该文件已被点击&#39;通常,它也需要我的连接脚本,如下所示。请注意,我使用$_SERVER['DOCUMENT_ROOT'](可能会产生影响吗?)。

  

需要$ _SERVER [&#39; DOCUMENT_ROOT&#39;]。&#39; /custom/functions/connect.php' ;;

1 个答案:

答案 0 :(得分:1)

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

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

当打开太多连接时,您将遇到这样的错误,并且再现不会那么明显。

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

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