Mysql с функцией Set Timeout, в то время как цикл для извлечения данных с определенным интервалом времени

php mysql while-loop settimeout

619 просмотра

1 ответ

Я хочу получить данные из таблицы базы данных с определенным интервалом времени. База данных заполняется каждые 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);

   ?>
Автор: Praneeth Samarasinghe Источник Размещён: 08.11.2019 11:29

Ответы (1)


0 плюса

Решение

Постоянная потребность в обновлении данных кажется мне идеальным кандидатом для использования SSE, как я упоминал в комментарии. Идея в том, что у вас есть php script ( 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>
Автор: RamRaider Размещён: 20.08.2016 05:06
Вопросы из категории :
32x32