如何防止PHP使用太多的MySQLi连接?

时间:2017-12-29 08:50:05

标签: php mysql

我正在创建一个消息传递网站,它使用MySQL数据库来存储消息数据。但是,如果同时只有 5个用户在线,则会因为" MySQLi: Cannot Connect: Too many MySQL connections"而开始失败。

我听说我的主机HelioHost将最大MySQL连接限制为4,这解释了我的错误(详见this)。

我想知道如何更改我的脚本(当前提交消息表单时将其连接,将其添加到数据库,然后断开连接)只能在服务器上最多使用四个连接。

这里有一些代码:

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);

// Check connection
if ($conn->connect_error) {
    die("MySQL server connection failed: " . $conn->connect_error);
}

//Process data
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $name = $_SESSION["username"];
    $parent = $_POST["thread"];
    $content = test_content($_POST["content"]);

    $sql = "INSERT INTO `threads_replies`(`Parent`, `Author`, `Content`) VALUES ('" . $parent . "','" . $name . "','" . $content . "')";
    $conn->query($sql) or die ("Failed MySQL query to save reply");

    echo "Reply saved. <a href=\"viewthread.php?id=" . $parent . "\"><span class=\"fa fa-chevron-circle-left\"></span> Back to Thread</a>";
}

function test_input($data) {
    $data = trim($data);
    $data = stripslashes($data);
    $data = htmlspecialchars($data);
    return $data;
}
function test_content($data) {
    $data = str_replace("'", "&#39;", $data);
    return $data;
}

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

直接来自文档: http://php.net/manual/en/function.mysqli-connect.php

$link = mysqli_connect("127.0.0.1", "my_user", "my_password", "my_db");

if (!$link) {
    $error = mysqli_connect_error();
    echo "Failed to connect to MySQL: $error";
    echo 'Sorry, pal, 5 already playing around...';    
    exit;// or location('wait.php');
}
# .... 
mysqli_close($link);

对于第5位用户 - 他应该重新加载页面,您可以将其重定向到 wait.php

<!-- htm, head, please add.. -->
<?php 
// no need in PHP, actually 
?>
<h3>Sorry, having too much users, will reload automatically...</h3>  

<script> 
   setTimeout(
     ()=> location.href = 
       location.href + '?t=' + (new Date()).getTime(), 
     5000 // hope 5 seconds will be enough
   );

 所以你的代码:

$conn = new mysqli($servername, $username, $password, $dbname);

// Check connection
if ($conn->connect_error) {
    location('wait.php');
    die("MySQL server connection failed: " . $conn->connect_error);
}

答案 1 :(得分:1)

您可以构建一个缓存系统,在访问数据库之前将对其进行检查(并建立连接)。例如,您不需要每次都从数据库中阅读首页上的新闻,他们不会经常更改。所以你从缓存系统中读取新闻(比如文件系统中的某个文件),然后显示来自它的数据。当新闻条目被更改时,您删除/使缓存无效,以便缓存在下次访问时重建(一次)。