Я пытаюсь в течение последних двух дней заставить это работать без везения. Он выполняется один раз, но не может продолжать обновляться после начальной загрузки. Функция не обновляется автоматически и не запускается через 30 секунд. Код кажется мне хорошим, но, очевидно, есть некоторый пробел в знаниях, которые у меня есть относительно долгого опроса, который заставляет это не работать. Если у кого есть момент, я был бы признателен, если бы вы могли расчесать это и сказать мне, что я делаю неправильно. Любая помощь приветствуется, спасибо.AJAX Длительный опрос не держит соединение открытым
JavaScript/JQuery
function poll(pid){
var dataString = 'pid=' + pid;
$.ajax({type: 'GET', url: 'http://localhost:8888/mysite/execs/vote_count.php', data: dataString, async: true, cache: false, success: function(data){
var post = $('#' +pid);
var post_children = post.children();
var upvotes = post_children.find('.upvotes');
var downvotes = post_children.find('.downvotes');
downvotes.text("-" + data.downvotes);
upvotes.text("+" + data.upvotes);
}, dataType: "json", complete: poll, timeout: 30000 });
};
$(".post").each(function(){
poll($(this).attr("id"));
});
PHP (vote_count.php)
<?php
$hostname = 'localhost';
$username = 'root';
$password = 'root';
$database = 'database';
try {
$dbh = new PDO("mysql:host=$hostname;dbname=$database", $username, $password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $dbh->prepare("SELECT * FROM vote WHERE post = :pid AND rating = 'votedown'");
$pid = $_GET['pid'];
$stmt->bindParam(':pid', $pid, PDO::PARAM_STR);
$stmt->execute();
$result = $stmt->fetchAll();
}
catch(PDOException $e)
{
echo $e->getMessage();
}
$stmt->execute();
$downvotes = $stmt->rowCount();
try {
$dbh = new PDO("mysql:host=$hostname;dbname=$database", $username, $password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $dbh->prepare("SELECT * FROM vote WHERE post = :pid AND rating = 'voteup'");
$pid = $_GET['pid'];
$stmt->bindParam(':pid', $pid, PDO::PARAM_STR);
$stmt->execute();
$result = $stmt->fetchAll();
}
catch(PDOException $e)
{
echo $e->getMessage();
}
$stmt->execute();
$upvotes = $stmt->rowCount();
$arr = array("downvotes"=>$downvotes,"upvotes"=>$upvotes);
echo json_encode($arr);
$dbh = null;
?>
Вы правы, это моя главная проблема. Я удивлен, что не думал об этом. Однако, несмотря на эту проблему, я понимаю, что это соединение должно оставаться открытым и создавать (по-видимому) автоматические обновления. В противном случае я мог бы просто использовать setInterval. Но даже в первые 30 секунд ничего не меняется. – Ian
Мой PHP - небольшая неделя, но я не вижу в вашем javascript никаких ссылок, чтобы открыть соединение. Весь тайм-аут отменяется, когда вызов AJAX сам разыгрывается, а jQuery каждый раз вызывает функцию опроса один раз для каждого сообщения. – devstruck
вот лучший и чистый шаблон для длительного объединения http://blog.falafel.com/Blogs/basem-emara/2012/06/06/polling-ajax-requests-in-javascript – ozhan