Mysql具有设置超时功能,While循环以特定的时间间隔获取数据


Mysql with Set Timeout function, While loop to fetch data with specific time interval

我想以特定的时间间隔从数据库表中获取数据。数据库正在被填充每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>