Я только что нашел этот пост, он старый, но концепция опроса создает проблемы для многих людей. Так что я приведу пример реализации здесь. Но прежде чем дать его вам, я должен дать вам совет, который некоторое время назад меня бесил:
При опросе вы должны позаботиться о поведении сессий ( условия гонки ). Для простоты: если вы открываете сеанс, файл сеанса блокируется до тех пор, пока сеанс не будет закрыт, чтобы избежать двух записей, записывающих в него разные данные. Поэтому, если вам нужен сеанс, чтобы проверить, вошел ли пользователь в систему или около того, всегда закрывайте сеанс перед опросом.
В моей демонстрации приведен пример реализации опроса в PHP. Я не буду использовать базу данных, но файл вместо этого. Когда вы нажмете кнопку опроса, вы войдете в цикл, и пока файл не будет изменен, вы будете продолжать опрос. Когда вы заполните форму и нажмете «Отпустить», то, что вы набрали, будет сохранено в файл. Время изменения файла изменится, поэтому опрос будет остановлен.
Совет: используйте инструмент, подобный Firebug , чтобы увидеть, что происходит.
Теперь давайте поговорим лучше, чем мой английский:
<?php
// For this demo
if (file_exists('poll.txt') == false) {
file_put_contents('poll.txt', '');
}
if (isset($_GET['poll'])) {
// Don't forget to change the default time limit
set_time_limit(120);
date_default_timezone_set('Europe/Paris');
$time = time();
// We loop until you click on the "release" button...
$poll = true;
$number_of_tries = 1;
while ($poll)
{
// Here we simulate a request (last mtime of file could be a creation/update_date field on a base)
clearstatcache();
$mtime = filemtime('poll.txt');
if ($mtime > $time) {
$result = htmlentities(file_get_contents('poll.txt'));
$poll = false;
}
// Of course, else your polling will kill your resources!
$number_of_tries++;
sleep(1);
}
// Outputs result
echo "Number of tries : {$number_of_tries}<br/>{$result}";
die();
}
// Here we catch the release form
if (isset($_GET['release']))
{
$data = '';
if (isset($_GET['data'])) {
$data = $_GET['data'];
}
file_put_contents('poll.txt', $data);
die();
}
?>
<!-- click this button to begin long-polling -->
<input id="poll" type="button" value="Click me to start polling" />
<br/><br/>
Give me some text here :
<br/>
<input id="data" type="text" />
<br/>
<!-- click this button to release long-polling -->
<input id="release" type="button" value="Click me to release polling" disabled="disabled" />
<br/><br/>
Result after releasing polling :
<div id="result"></div>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>
<script type="text/javascript">
// Script to launch polling
$('#poll').click(function() {
$('#poll').attr('disabled', 'disabled');
$('#release').removeAttr('disabled');
$.ajax({
url: 'poll.php',
data: {
poll: 'yes' // sets our $_GET['poll']
},
success: function(data) {
$('#result').html(data);
$('#poll').removeAttr('disabled');
$('#release').attr('disabled', 'disabled');
}
});
});
// Script to release polling
$('#release').click(function() {
$.ajax({
url: 'poll.php',
data: {
release: 'yes', // sets our $_GET['release']
data: $('#data').val() // sets our $_GET['data']
}
});
});
</script>
Вы можете попробовать это здесь