我想以特定的时间间隔从数据库表中获取数据。数据库正在被填充每5秒的时间,所以我需要获取数据5秒的间隔。
这是我的代码没有setTimeout函数,它显示整个结果到表中填写的值,但必须刷新页面以获得在此之后填写的其他数据。
<?php
$con = mysql_connect("localhost","shsas","");
if (!$con) {
die('Could not connect: ' . mysql_error());
}
else
{
<script type="text/javascript">
mysql_select_db("shsas", $con);
$sth = mysql_query("SELECT Gaslevel FROM gas");
$rows = array();
$rows['name'] = 'Gaslevel';
setTimeout(function(){
while($r = mysql_fetch_array($sth)) {
$rows['data'][] = $r['Gaslevel'];
$result = array();
array_push($result,$rows);
print json_encode($result, JSON_NUMERIC_CHECK);
},5000);
}
</script>
}
mysql_close($con);
?>
对我来说,不断刷新数据的需求似乎是使用SSE的理想选择,就像我在评论中提到的那样。这个想法是你有一个php脚本(gas_sse.php
),开始在一个无尽的循环工作,一旦你的javascript &HTML页面初始化连接。无止境的循环有一个sleep
调用,并且在规定的时间(5s
)内什么都不做-在循环中,您将查询数据库的最新信息(并且您可能想要编辑sql,以便它不会在每次迭代时返回更大的记录集,如果数据库每5秒更新一次新行)
一旦查询运行,您可以在将记录集作为消息发送到javascript侦听器之前处理它,并在客户端处理它,但您认为合适。
下面是一个未经测试的基本思想的例子——如果有错误(如果没有测试通常是有错误的),那么我道歉。
<?php
/*
gas_sse.php
*/
set_time_limit( 0 );
ini_set('auto_detect_line_endings', 1);
ini_set('mysql.connect_timeout','7200');
ini_set('max_execution_time', '0');
/* -- Edit to suit your location -- */
date_default_timezone_set( 'Europe/London' );
ob_end_clean();
gc_enable();
/* -- set headers -- */
header('Content-Type: text/event-stream'); /* !important! */
header('Cache-Control: no-cache');
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Allow-Methods: GET');
header('Access-Control-Expose-Headers: X-Events');
/* -- utility function to send formatted sse message -- */
if( !function_exists('sse_message') ){
function sse_message( $evtname='gas', $data=null, $retry=1000 ){
if( !is_null( $data ) ){
echo "event:".$evtname."'r'n";
echo "retry:".$retry."'r'n";
echo "data:" . json_encode( $data, JSON_FORCE_OBJECT|JSON_HEX_QUOT|JSON_HEX_TAG|JSON_HEX_AMP|JSON_HEX_APOS );
echo "'r'n'r'n";
}
}
}
/* -- How often to send messages -- */
$sleep=5;
/* You should use mysqli or PDO instead!!! */
$con = mysql_connect( "localhost", "shsas", "" );
mysql_select_db( "shsas", $con );
while( true ){
if( connection_status() != CONNECTION_NORMAL or connection_aborted() ) {
break;
}
/* Infinite loop is running - perform actions you need */
/* -- Query database -- */
$sql='select `Gaslevel` from`gas` order by `id` desc limit 100;';
$res=mysql_query( $sql );
$payload=array();
while( $rs=mysql_fetch_assoc( $res ) ){
$payload[]=$rs;
}
/* -- prepare sse message -- */
sse_message( 'gas', $payload );
/* -- Send output -- */
if( @ob_get_level() > 0 ) for( $i=0; $i < @ob_get_level(); $i++ ) @ob_flush();
@flush();
/* wait */
sleep( $sleep );
}
if( @ob_get_level() > 0 ) {
for( $i=0; $i < @ob_get_level(); $i++ ) @ob_flush();
@ob_end_clean();
}
?>
在初始化到sse脚本连接的html页面上,一般的想法是这样的:
<script type='text/javascript'>
var evtSource = new EventSource( "gas_sse.php" );
evtSource.onmessage = function(e) {
var json=JSON.parse( e.data );
/* do stuff with json data */
}
</script>