Здравствуйте, столкнулся с такой проблемой.... Решил я заняться изучением long polling, естественно чтобы попрактиковаться стал писать чатик Алгоритм скрипта примерно такой: в базе данных sqlite есть таблица с сообщениями. Приложение клиента отправляет количество сообщений которое у него уже есть (число). Скрипт записывает это число в переменную, затем с помощью sql запроса узнаёт сколько сообщений в базе данных. Если в БД сообщений больше чем у клиента, то скрипт получает из БД недостающие строки и отправляет их клиенту. Если проще: клиент прислал число 5, скрипт узнал что в БД 8 записей, значит клиенту он отправит 3 последние строки. Скрипт по этой схеме вполне себе работает, НО: в конце цикла есть функция sleep(2), которая должна создавать паузу между итерациями чтобы скрипт не начал флудить огромным количеством запросов. Проблема в том, что всё равно флудит! Да, клиент получает ответ от сервера через заданный в sleep() промежуток времени, со стороны кажется что всё в порядке. Когда я начал тестировать, то заметил что сервер через 10-15 минут после запуска скрипта обрывает соединение с ошибкой 503. Тогда я добавил в начало цикла переменную, значение которой увеличивалось на +1 с каждой итерацией, затем это число записывалось в файл. Оказалось, цикл срабатывает от 50 до 1000 раз в секунду, будто sleep() там нет..... Надеюсь на вашу помощь друзья, ковыряюсь уже с этим 3-й день, задавал этот вопрос в различных пабликах в ВК посвящённых php, все либо игнорили, либо скидывали ссылки на всякие книжки. Код: PHP: <?php $dbh = new PDO('sqlite:db.db3'); $dbh->exec("PRAGMA foreign_keys = ON;"); $dbh->exec("PRAGMA SQLITE_OPEN_NOMUTEX;"); $dbh->exec("PRAGMA encoding = 'UTF-8'"); $dbh->exec("PRAGMA journal_mode = WAL;"); $dbh->exec("PRAGMA synchronous = OFF"); $number = (int) $_POST['number']; $action = $_POST['action']; switch ($action) { case 'update': $live_time = microtime(true); $this_time = microtime(true)-$live_time; if ($this_time >= 5) { // Закрываем соединение с базой $dbh = null; $message = [ 'status' => 'no database' ]; echo json_encode($message, JSON_NUMERIC_CHECK); die(); } while(true){ sleep(1); $number_s = $dbh->query('SELECT COUNT(id) FROM Messages')->fetchColumn(); if($number_s != $number){ $amount = $number_s - $number; if($amount < 0){ $amount = 0; $message = [ 'status' => 'clear', ]; echo json_encode($message, JSON_NUMERIC_CHECK); die(); }//конец if $sth = $dbh->prepare("SELECT * FROM (SELECT * FROM Messages ORDER BY id DESC LIMIT ?) t ORDER BY id"); $sth->execute(array($amount)); $result = $sth->fetchAll(); $dbh = null; // sleep(1); break; } //конец if sleep(2); } //конец while $message = [ 'status' => 'success', 'sql' => $result ]; echo json_encode($message, JSON_NUMERIC_CHECK); break; } //конец switch $dbh = null; die(); ?>
можно с помощью ajax делать запрос со страницы к скрипту, с целью получения новых сообщений, и повторять ajax запрос каждые 5 секунд
@username, чел хочет long pulling, а ты предлагаешь short. @KnaviBebus, согласен с @igordata, лучше пользовать веб-сокеты и технологии работы с ними. Браузеры, которые их не поддерживают, уже сдохли