Long Polling с mysqli не возвращает данных


данные data.php, файла базы данных не возвращает, если я изменить все data.php pra любой текст, html, он возвращает работает, long polling, но если я пытаюсь использовать mysqli ничего не возвращает.

Что я могу сделать, чтобы исправить эту проблему ?

это Не ошибка SELECT, потому что если вы откроете data.php, отдельно он возвращает данные.

Index.php

<html>
    <head>
        <script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
        <script type="text/javascript" src="client.js"></script>
    </head>
    <body>
        <h3>Conteúdo</h3>
        <div id="response"></div>

    </body>
</html>

Server.php

<?php
// arquivo cujo conteúdo será enviado ao cliente
$dataFileName = 'data.php';
while ( true )
{
    $requestedTimestamp = isset ( $_GET [ 'timestamp' ] ) ? (int)$_GET [ 'timestamp' ] : null;

    // o PHP faz cache de operações "stat" do filesystem. Por isso, devemos limpar esse cache
    clearstatcache();
    $modifiedAt = filemtime( $dataFileName );

    if ( $requestedTimestamp == null || $modifiedAt > $requestedTimestamp )
    {
        $data = file_get_contents( $dataFileName );

        $arrData = array(
            'content' => $data,
            'timestamp' => $modifiedAt
        );

        $json = json_encode( $arrData );

        echo $json;

        break;
    }
    else
    {
        sleep( 2 );
        continue;
    }
}
?>

Client.js

function getContent( timestamp )
{
    var queryString = { 'timestamp' : timestamp };

    $.get ( 'server.php' , queryString , function ( data )
    {
        var obj = jQuery.parseJSON( data );
        $( '#response' ).html( obj.content );

        // reconecta ao receber uma resposta do servidor
        getContent( obj.timestamp );
    });
}

$( document ).ready ( function ()
{
    getContent();
});

Дата.php

<?php
$conexao = mysqli_connect ("localhost","usuario","senha","db");
$resulta = mysqli_query ($conexao,"SELECT * FROM nome");
while ($exibe = mysqli_fetch_array($resulta)){
?>

<?php echo $exibe['nomes']; ?>

<?php } ?>
Author: Josimara, 2015-01-08

2 answers

Проблема заключается в file_get_contents() ваш код.

, Если вы используете file_get_contents() в файле php (как был использован в коде), он будет возвращать string код; то есть, он не будет обрабатываться как php.

, что бы код толковаться как ожидается, будет функция include, но я не знаю, если и в этом случае она будет применяться.

Я Вижу, что вы пытаетесь проверить дата изменения файла, но это было бы неэффективно, поскольку поэтому вы должны проверить, дату в базе (так что запрос в банк); и, в кратчайшие сроки, есть в сценарии, изменить дату файла (некоторые модификации).

Я использовал сценарий, хорошо вроде этого, чтобы изучить Long Polling, и сценарий очень похож, что я использовал. Я могу вам гарантировать, что он не будет работать для операций MYSQL.

Единственный способ заставить его работать (не из лучших), обмениваться

Это:

$dataFileName = 'data.php'

", это:

$dataFileName = 'http://localhost/sua_pasta_de_testes/data.php';

Таким образом, вы бы действительно ловить HTML-ответа ваш PHP-скрипт уже запущен, и он не только в качестве файла в папке. Так как file_get_contents работает как для файлов в текущем каталоге, например, для url-адреса (если политика allow_url_fopen PHP.ini настроен On).

 2
Author: Wallace Maxters, 2015-01-10 17:34:00

В Этом примере я сделал, что отправил на мой блог. Есть времена, многие задают мне вопрос, как адаптировать пример использования базы данных. Узнайте, как сделать с помощью PDO и SQLite:

$dbFile = 'comments.db';

$PDO = new PDO( "sqlite:" . $dbFile );

while ( true )
{
    $requestedTimestamp = isset ( $_GET [ 'timestamp' ] ) ? (int)$_GET [ 'timestamp' ] : time();

    $stmt = $PDO->prepare( "SELECT author, comment, timestamp FROM comments WHERE timestamp >= :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;
    }
}

Если вы предпочитаете использовать MySQLi вместо PDO, просто немного измените сценарий, изменив класс PDO через MysQLi. Но логика та же.

Обновил оригинальный пост с примером, используя PDO и SQLite. Посмотрите его здесь: http://rberaldo.com.br/server-push-long-polling-php-ios/

 2
Author: Beraldo, 2015-01-12 15:22:11