Long Polling request loop in phpt?

Asked

Viewed 193 times

0

I need to create a way to notify system users each time a database table receives a new record.

I’m using as a basis an example published here Server Push: Long Polling but I’m having some problems, the first of which is that analyzing the browser network it makes several requests until the browser crashes... and as a consequence it keeps repeating the database registration list, it follows the code of the server.php:

<?php
include ('config.php');
include ('database.php');

$requestedTimestamp  = isset ( $_GET [ 'entry' ] ) ? (int)$_GET [ 'entry' ] : time();

while ( true )
{   
    $stmt = $PDO->prepare("SELECT * FROM notifications WHERE entry >= :requestedTimestamp" );

    $stmt->bindParam(':requestedTimestamp', $requestedTimestamp);
    $stmt->execute();

    $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

    if ( count( $rows ) > 0 ){          
        $json = json_encode( $rows );       
        echo $json;     
        break;
    }else{
        sleep( 2 );
        continue;
    }

}

and this is the js:

function getContent( entry )
{
    var queryString = { 'entry' : entry };
    $.get('./database/server.php', queryString, function( data ) {
        var obj = jQuery.parseJSON( data ),
        string = "";

        // lista obj json
        for (var i in obj) 
        {                  
            var classy = obj[i]['readable'] == 0 ? 'new-notfication' : '';
            string += '<div class="table notification-table '+classy+'">';
            string += '<div class="td"><img src="img/default/default-user-image.png" alt=""></div>';
            string += '<div class="td">';
            string += '<p><a href="#"><strong>'+obj[i]['title']+'</strong></a></p>';
            string += '<p>'+obj[i]['msg'].substr(0,66)+'...</p>';
            string += '</div>';
            string += '<div class="td"><a href="#" class="close"><span class="fa fa-times" aria-hidden="true"></span></a></div>';
            string += '</div>';
            $('#entry').append(string);
        }

        //reconecta
        //  getContent(data);
    });
}

getContent();

in the first execution of the function it repeats the record and brings 6 values.

1 answer

0


I looked for more about long Polling to understand how it works and develop logic: php server.

# includes de conexão
include ('config.php');
include ('database.php');
include ('conection.php');

# define momento em que começou a roda o Polling
$start = time();
# Defini tempo maximo da conexão
$timeRequest = 55;

#verifica se ouve post
if (isset( $_POST['entry'] )) {
    # previne injections e tags invalidas
    $entry = DBEscape( trim( $_POST['entry']  ) );
}else{
    # pega hora atual do servidor 
    $getTime = $PDO->prepare("SELECT NOW() as now");
    # executa query 
    $getTime->execute();
    # transforma o resultado em objeto
    $result = $getTime->fetchObject();
    # atribui valor do resultado
    $entry = $result->now;
}

# pepara a query para buscar os registro novos
$stmt = $PDO->prepare("SELECT * FROM notifications WHERE entry > '$entry'" );

# controle para saber se ouve novo registro
$newData = false;
# array para as novas notificações
$notify = array();

# mantem a conexão aberta até o limite maximo estabelecido em $start
while (!$newData and (time()-$start) < $timeRequest ) {
    $stmt->execute();

# caso encontre resultado fecha a conexão
while ($result = $stmt->fetchAll(PDO::FETCH_ASSOC)) {
    # atribui valor do resultado
    $notify = $result;
    # encerra a conexão
    $newData = true;
}
# aguarda 1/2 segundo para abrir a conexão
usleep(500000);
}
# pega novamente a hora do servidor
$getTime = $PDO->prepare("SELECT NOW() as now");
# executa query
$getTime->execute();
# transforma resultado em objeto
$result = $getTime->fetchObject();
# atribui valor do resultado
$entry = $result->now;
# converte tudo em um array
$data = array('notify' => $notify, 'entry' => $entry );
# envia dados em formato Json para o front-end 
echo json_encode($data);
# encerra execução de escript php
exit;

front-end:

// chamada a função
getNotifications();

function getNotifications( entry )
{   
    // cria array de dados
    var data = {};
    // verifica se existe um tempo definido
    if(typeof entry != 'undefined'){
        // atribui o tempo definido ao objeto
        data.entry = entry;
    }

    // envia os dados para o script de polling
    $.post('./database/server.php', data, function(result) {           
        for(i in result.notify){
            // passa os valores para a lista de notitficações
            $('#entry').append(result.notify[i].title);
        }
        // reinicia a busca por dados
        getNotifications(result.entry);
    }, 'json');
}

Browser other questions tagged

You are not signed in. Login or sign up in order to post.