PHP常量SQL查询

时间:2013-03-27 05:49:26

标签: php javascript mysql crash

我需要每隔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脚本。我做错了吗?任何人对更好的实施都有任何建议吗?

3 个答案:

答案 0 :(得分:2)

我认为你正在寻找在脚本结束时让数据库“unclosed”的东西。

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

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

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

答案 1 :(得分: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()更好的方法,因为您最终可能会有两个并发连接,请求A可能会在请求B之前启动,但可能会在之后结束 B,因为发生了一些事情,完成请求需要一秒多的时间。这可能会导致一些奇怪的行为。

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

答案 2 :(得分:0)

是的,它可以以更好的方式实施。 正如您每次使用相同的Database connection configuration一样,无需在页面刷新时连接和关闭数据库每秒连接数据库服务器是非常昂贵的电话

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

这个想法是:

使用Persistent Database Connection

请参阅以下post中的 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小时内也没有崩溃