SQLSTATE [HY000] [2002]连接超时

use*_*659 6 php mysql pdo

偶尔在我的错误日志中记录这个并想知道问题:

[04-Oct-2014 13:25:42 America/Chicago]无法连接数据库:SQLSTATE [HY000] [2002]连接超时[2014年10月4日13:25:42美国/芝加哥] PHP致命错误:在第28行的/home/spconlin/public_html/spc_app/app/add_log.php中调用非对象的成员函数prepare()

连接脚本:

<?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());
}

?>
Run Code Online (Sandbox Code Playgroud)

我做了什么 :

  • 在连接中从"localhost"切换到127.0.0.1
  • 将持久连接切换为false

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

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

DB是innodb.

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

编辑:

它是否需要我需要在页面上连接脚本的方式?由于文件经常被"命中",因此下面的行也需要我的连接脚本.请注意我正在使用$_SERVER['DOCUMENT_ROOT'](可能有影响?).

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

med*_*eda 1

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

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

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

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

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