代码之家  ›  专栏  ›  技术社区  ›  Troy Buerge

在共享主机上处理MySQL“连接太多”错误

  •  0
  • Troy Buerge  · 技术社区  · 6 年前

    我有一个使用MySQL数据库存储登录用户信息的网站,还有我的数据。此网站宿主在共享宿主服务器上。我遇到的问题是我偶尔会遇到一个SQL连接太多的错误。我的最大连接数设置为默认值151。

    我正在对所有服务器端脚本使用PHP,并使用mysqli pdo连接。

    下面是一些示例代码,演示如何处理来自PHP脚本的SQL连接。我删除了与问题无关的任何内容,例如输入过滤和字符转义。

    <?菲律宾
    需要(“common.php”);
    //获取post数据
    //我的数据库查询
    $query=”
    选择
    身份证件,
    用户名,
    密码,
    盐,
    电子邮件
    来自用户
    在哪里?
    用户名=:用户名
    “;
    //为准备好的语句设置参数
    $query_params=数组(
    ':用户名'=>$_post['username']
    )(二)
    试试看{
    $stmt=$db->准备($query);
    $result=$stmt->执行($query_params);
    }
    捕获(pdoexception$ex){
    $miscerr=“发生故障,请重试。”;
    }
    $row=$stmt->fetch();
    
    //使用$row中的数据进行密码散列、检查和登录用户
    }
    是吗?>
    

    下面是抛出错误的common.php。我不知道正确的处理方法是什么,因为我希望代码在失败之前尝试几次。

    <?菲律宾
    $username=“用户名”;
    $password=“*************”;
    $host=“本地主机”;
    $dbname=“我的名字”;
    
    
    $options=array(pdo::mysql_attr_init_command=>'设置名称utf8');
    $miscerr=“”;
    试试看{
    $db=new pdo(“mysql:host=$host dbname=$dbname charset=utf8”,$username,$password,$options”);
    }
    捕获(pdoexception$ex){
    $miscerr=“失败,请重试”;
    }
    
    $db->setattribute(pdo::attr_errmode,pdo::errmode_exception);
    $db->setattribute(pdo::attr_default_fetch_模式,pdo::fetch_assoc);
    enter image description here

    我正在对所有服务器端脚本使用PHP,并使用mysqli-pdo连接。

    下面是一些示例代码,演示如何处理来自PHP脚本的SQL连接。我删除了与问题无关的任何内容,比如输入过滤和字符转义。

    <?php 
    require("common.php");
        //get POST data
        //My database query
        $query = " 
            SELECT 
                id, 
                username, 
                password, 
                salt,
                email
            FROM users 
            WHERE 
                username = :username 
        "; 
        //set params for prepared statements
        $query_params = array( 
            ':username' => $_POST['username']
        ); 
        try { 
            $stmt = $db->prepare($query); 
            $result = $stmt->execute($query_params); 
        } 
        catch(PDOException $ex) { 
            $miscErr = "Something failed, please try again.";        
        }  
        $row = $stmt->fetch();
    
        //do my password hashing, and checking, and sign in user using data in $row 
    }
    ?>
    

    下面是抛出错误的common.php。我不确定正确的处理方法是什么,因为我希望代码在失败之前尝试几次。

    <?php 
    $username = "username"; 
    $password = "**************"; 
    $host = "localhost"; 
    $dbname = "mydbname"; 
    
    
    $options = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'); 
    $miscErr = "";
    try { 
        $db = new PDO("mysql:host={$host};dbname={$dbname};charset=utf8", $username, $password, $options); 
    } 
    catch(PDOException $ex) { 
        $miscErr = "Something failed, please try again"; 
    } 
    
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
    
    1 回复  |  直到 5 年前
        1
  •  0
  •   Troy Buerge    5 年前

    $db = "";   // db object
    $er = "";     // error object
    
    /*setdb() is the function that actually gets and starts the db connection.
        It returns either the db object, or false. The loop will try up to 5 times 
        to connect with .1 second breaks in between. if that fails then it logs an
        error, and the page fails to load. This has not happened in over 5 months on
        a live site.*/ 
    
    for ($i = 0; $i = 5; $i++) {     //  short loop
        if (setdb() !== false) {
            $db = setdb();          // if successful breaks
            break;
        } else {
            if ($i = 5) {         // after 5 trys, logs error.
                file_put_contents('sqlerror.er', $er . "\r\n", FILE_APPEND);
            }
        }
        usleep(100000);           // .1second sleep
    }
    
    function setdb(){
        $username = "my-username";
        $password = "***************"; 
        $host = "localhost";
        $dbname = "my_database";
    
        $options = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8');
        $miscErr = "[1040] Too many connections";
    
        try {         // try to make connection
            $db = new PDO("mysql:host={$host};dbname={$dbname};charset=utf8", $username, $password, $options);
        }
        catch(PDOException $ex) {
            $er = $ex;
            $pos = strpos($ex, $miscErr);
            if ($pos !== false) {
                return false;           //return false on error
            }
            file_put_contents('sqlerror.er', $ex . "\r\n", FILE_APPEND);
        }
        return $db;         // return true
    }
    
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); 
    
    session_start();