Постоянная необходимость обновления данных представляется мне идеальным кандидатом на использование SSE, как я упоминал в комментарии. Идея заключается в том, что у вас есть php-скрипт (gas_sse.php
), который начинает работать в бесконечном цикле, как только ваша страница javascript & html инициализирует соединение. Бесконечный цикл имеет вызов sleep
и ничего не будет делать в течение заданного периода времени (5s
) - внутри цикла вы запросите базу данных для получения последней информации (и вы, вероятно, захотите отредактировать sql, чтобы она не возвращала более большой набор записей на каждой итерации, если db обновляется новыми строками каждые 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 странице, которая инициализирует соединение с ße сценария общая идея была бы вдоль этих линий:
<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>
Использование 'AJAX'. В настоящее время вы смешиваете код ('PHP' и' JavaScript'), и он является синтаксически неправильным. – Script47
Вы должны *** переключиться с 'mysql_ *', как это было [официально] (http://php.net/manual/en/migration55.deprecated.php) устарело. Используйте ['mysqli_ *'] (http://php.net/manual/en/book.mysqli.php) или [PDO] (http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers) ** с ** [подготовлено заявления] (http://php.net/manual/en/pdo.prepared-statements.php). – Script47
Не могли бы вы показать мне, как это сделать с моим кодом. Я действительно новичок в этом php. –