我需要每隔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脚本。我做错了吗?任何人对更好的实施都有任何建议吗?
答案 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小时内也没有崩溃。