Автоматическое обновление контента из бд

Рейтинг: 0Ответов: 3Опубликовано: 06.01.2015

Есть некая страница news.php. На этой странице выводятся заголовки новостей из базы данных, из таблицы news. Нужно, чтобы на странице news.php все обновлялось, как только будет добавлена новая запись в бд, т.е. новость. Прошу, не предлагайте варианты с автообновлением блоков на jQuery, это сильно нагружает. Мне нужно найти простой и оптимальный вариант для данной задачи, который можно будет применять как ядро (например, система обмена личными сообщениями). Подскажите какую-либо документацию, желательно с примерами. А у кого время есть — Добрый Человек, напиши расширенный ответ!

Ответы

▲ 2

Как вариант, можно использовать следующую логику:

  1. Загружаем страницу с новостями.
  2. Каждые n секунд (зависит от допустимой нагрузки на сервер) javascript отправляет ajax запрос на сервер, в котором параметром указан id или время самой свежей новости на странице.
  3. Если новых новостей нет, сервер отправляет пустой ответ, иначе - данные новостей (обычно JSON или XML).
  4. (Если получены данные новостей) JavaScript добавляет новые новости в ленту.

Система личных сообщений в ВК работает примерно так.

Касательно того, что jQuery сильно нагружает:

Если речь идет о нагрузке библиотеки на машины клиента, то, к сожалению, тут мало что можно сделать. В большинстве случаев это проблемы не конкретно jQuery, а машины клиента в целом. Хотя если написанный на jQuery скрипт с успехом кладет большинство клиентов - скорее всего, это ошибка в написании скрипта.

Если речь идет о нагрузке на сервер, то у меня только 1 совет: кэшируйте.

▲ 2

Один select запрос при MyISAM - это ничтожно мало (с правильными индексами), при условии, что дергается только заголовок + mysql сама "кэширует" запросы. Есть вариант с long polling или WebSocket, но это будет создавать еще большую нагрузку (касается только сокетов). Если уж так и хочется (что аж горит) оптимизировать и в ядро, то вот Вам Comet. Ну и, наверное, приведу решение на jQuery, для очистки совести. :)

<script>
    function show()
    {
        $.ajax({
            url: "ajax/last10.php", // Путь к php скрипту который будет загружать заголовки
            cache: false,
            success: function(html){
                $("#lasttenposts").html(html); // Блок куда будем выводить информацию
            }
        });
    }

    $(document).ready(function(){
        show();
        setInterval(show, 5000); // Интервал обновления в миллисекундах 
    });
</script>

Сюда будем выводить результат:

<div id="lasttenposts"></div>

Ну, немного про "кэширование" в php, Memcached.

▲ 1

если говорить о нагрузке на сервер - то websocket даёт самую минимальную, мало того, информация на клиенте может обноалятся только при изменении данных на сервере - сервер сам разошлет "подписчикам" нужную инфу. если источник информации редкий то сервер будет курить бамбук(что свойственно для новостей). ajax запросы будут долбить сервер постоянно.