Я хочу получить данные из таблицы базы данных с определенным интервалом времени. База данных заполняется каждые 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();
}
?>
И на вашей html-странице, которая инициализирует соединение со скриптом sse, общая идея будет выглядеть следующим образом:
<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>
Других решений пока нет …