0

我需要每 1 秒不断地从我的数据库中读取一次以获取最新值。这是我的代码:

    <?php
    // connect to the "tests" database
    $conn = new mysqli('localhost', 'root','','Test');

    // check connection
    if (mysqli_connect_errno()) {
     exit('Connect failed: '. mysqli_connect_error());
    }

    // SELECT sql query
   $sql = "SELECT * FROM `Value`"; 

   // perform the query and store the result
   $result = $conn->query($sql);

   if (!$result)
    print 'Error!';

   // if the $result contains at least one row
   if ($result->num_rows > 0) {
    // output data of each row from $result
     while($row = $result->fetch_assoc()) {
      $output=$row;
    print_r($output);
     }
   } 
   else {
    print '0 results';
   }

   $conn->close();
   ?>

我的 HTML 代码每 1 秒刷新一次,如下所示:

function reload (){
    setInterval(getData,1000);
}

function getData()
  {
    $.get('test.php', function(data) {

        var output = data;

        document.getElementById("output").innerHTML = "Info: " + output;
    }); 
  }
....
<body onload="reload();">

<p id="output"></p>

</body>

一切正常,但大约 5-10 分钟后 MYSQL 服务器崩溃。我假设它正在超载。我的想法是我每次都在运行 php 脚本,它每秒都连接。我做错了吗?有人对更好的实施有任何建议吗?

4

3 回答 3

2

我认为您正在寻找脚本结束时数据库“未关闭”的东西。

在 mysqli 中,您可以通过添加 p: 来添加主机名以使用所谓的持久数据库连接

// connect to the "tests" database
$conn = new mysqli('p:localhost', 'root','','Test');

在此处阅读有关持久连接的更多信息:http: //php.net/manual/en/features.persistent-connections.php

于 2013-03-27T06:07:31.120 回答
0

您可以尝试让它在最后一个请求完成后 1 秒后才开始下一个请求,方法是调用setTimeout()回调,如下所示:

function getData()
  {
    $.get('test.php', function(data) {

        var output = data;

        document.getElementById("output").innerHTML = "Info: " + output;
        setTimeout(getData, 1000);
    }); 
  }
....
<body onload="getData();">

这通常是比使用更好的方法setInterval(),因为您可能最终有两个并发连接,并且 requestA可能在 request 之前开始B,但可能在 之后结束 B因为发生了一些事情并且完成请求花费了超过一秒钟。这可能会导致一些奇怪的行为。

这也可以解决您的问题,因为它可能会失败,因为它最终会从同一个 IP 打开多个并发连接等。

于 2013-03-27T06:00:13.067 回答
0

是的,它可以以更好的方式实施。由于您 Database connection configuration每次都使用相同的,因此无需在页面刷新时连接和关闭数据库每秒连接到数据库服务器是非常昂贵的调用

你为什么不just reload/refresh the query statement呢?

这个想法是:

使用持久数据库连接

请参阅以下帖子中的BlaM答案, 以了解为什么持久连接是最佳的。

将查询放在单独的 div 中,例如 #load。

      echo '<div id="load">';
// SELECT sql query
   $sql = "SELECT * FROM `Value`"; 

   // perform the query and store the result
   $result = $conn->query($sql);

   if (!$result)
    print 'Error!';

   // if the $result contains at least one row
   if ($result->num_rows > 0) {
    // output data of each row from $result
     while($row = $result->fetch_assoc()) {
      $output=$row;
    print_r($output);
     }
   } 
   else {
    print '0 results';
   }
       echo '</div>';

使用 jquery 函数仅刷新 #load div

<script type="text/javascript">
var auto_refresh = setInterval(
function ()
{
$("#load").load("filename.php #load");
}15000); // refresh every 1 second
</script>

我已经为自动刷新排行榜页面实现了这个。它运行良好,服务器即使在 50 小时内也没有崩溃

于 2013-03-27T06:00:59.450 回答