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 } ?>
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
).
В Этом примере я сделал, что отправил на мой блог. Есть времена, многие задают мне вопрос, как адаптировать пример использования базы данных. Узнайте, как сделать с помощью 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/