2013-11-16 3 views
0

В настоящее время у меня есть несколько div, которые извлекают отдельные страницы и обновляют содержимое каждые x секунд. Они должны показывать обновления в реальном времени из футбольных матчей и в настоящее время обновлять каждые 90 секунд, когда игры воспроизводятся, и 90000 секунд, когда игры не воспроизводятся (чтобы эффективно отключить обновление).Обновить div только при изменении внешнего контента

Вопросы, я в настоящее время являюсь ...

  • Перед игры начинаются, я должен пройти через страницу и изменить яваскрипт таймера вручную и повторно загружать файлы, делать то же самое, как только игры закончены ,
  • Даже в течение 90 секунд, когда около 100 человек часто просматривают сайт, сервер занимает немного стука и может либо замедлить, либо просто дать 500 внутренних ошибок сервера.
  • Если я забыл выключить (или не могу, потому что у меня нет сигнала на моем телефоне) после игр, когда трафик увеличивается по мере того, как люди начинают возвращаться домой, на самом деле сайт занимает несколько часов - и это вызвало наш сайт чтобы заблокировать его на несколько недель.

Пример кода в вопросе

<script> 
$(document).ready(function() { 
    $("#mdetails").load("/content/phppages/matchdetailsbase.php"); 
    var refreshId = setInterval(function() { 
     $("#mdetails").load('/content/phppages/matchdetailsbase.php?randval='+ Math.random()); 
    }, 90000); 
    $.ajaxSetup({ cache: false }); 
}); 
</script> 

Это один от http://www.margate-fc.com/content/1st_team/fixtures_results/match_detailsnew.php?all_games_id=4733 и обновляет всю основную область содержимого (в разделе «о матче»). В блоке «Матчи» в верхней части левого столбца есть аналогичный блок.

match_detailsnew.php содержит 5 различных запросов, поэтому предложения, которые я прочитал, чтобы проверить изменения базы данных, будут трудно реализовать здесь.

По общему признанию, этот код был скопирован/вставлен откуда-то, поскольку я ничего не знал о JQuery, и хотя я сейчас очень немного все еще на моей кривой обучения. Настройка всего сайта ужасна, но это была моя первая попытка на динамическом сайте около 4 лет назад, и я сейчас перестраиваю его с нуля. С этим я получу себя знакомым с опросом базы данных для изменений и обновления на основе этого. Тем не менее, это далеко, и мы отчаянно нуждаемся в решении сейчас!

Что я хотел бы, это для jQuery, чтобы проверить, изменился ли результат matchdetailsbase.php вообще (учитывая, что это будет изменение в любом месте страницы, сгенерированное любым из 5 запросов), и если оно есть, обновите div, считая, что это не приведет к тому, что на сервере будут помещаться одни и те же штампы/страницы, чем это делает постоянное обновление.

Если возникнут проблемы, связанные с моей настройкой, альтернативой будет создание переменной для времени обновления, которую я могу изменить в одном месте и будет распознан всеми div. Я попробовал это, установив $ RefreshTime = 900 в моем файле конфигурации, а затем изменить сценарий

$("#mdetails").load('/content/phppages/matchdetailsbase.php?randval='+ Math.random()); 
    }, <?php echo $refreshtime; ?>); 

Это не похоже, не делают разницы, что я положил в $ RefreshTime, но даже если это так, я понял, что, поскольку $ refreshtime находится за пределами обновляющегося div, оно не будет подбирать никаких изменений для него, поэтому когда бы он ни был установлен, когда первая загрузка страницы всегда будет оставаться до тех пор, пока полная страница не будет обновлена ​​вручную, даже если бы я изменил ее в config .php.

Как уже упоминалось ранее, это действительно краткосрочное решение, так как сайт перестраивается, поэтому я действительно не против падения и грязного взлома в случае необходимости!

Заранее спасибо

Стив

ответ

0

Update: в @fijas указует мое решение не позволит решить проблему сервера ударной, как вы по-прежнему будете посылать запросы. Проблема должна решаться на стороне сервера.

С Jquery Docs:

$("#success").load("/not-here.php", function(response, status, xhr) { 
    if (status == "error") { 
    var msg = "Sorry but there was an error: "; 
    $("#error").html(msg + xhr.status + " " + xhr.statusText); 
    } 
}); 

В теории, если страница одно и то же он должен вернуть 304, верно? Итак, что бы я сделал, это проверить, является ли статус 304, если это так, иначе обновите.

http://api.jquery.com/load/

Edit: Это может быть связано Refresh div, but only if there is new content from php file

Edit 2:

<script> 
$(document).ready(function() { 
    $("#mdetails").load("/content/phppages/matchdetailsbase.php"); 
    var refreshId = setInterval(function() { 
     $.get({ 
     url: "/content/phppages/matchdetailsbase.php", 
     success: function (data, textStatus, xhr) { 
     if (textStatus == "notmodified") { 
      pass 
     } else { 
      $('#mdetails').html(data); 
     } 
     } 
    }); 
    }, 90000); 
    $.ajaxSetup({ cache: false }); 
}); 
</script> 

ли, что имеет смысл для вас? Возможно, это не так. Не уверен.

+0

Этот бит кода находится вне меня, но принимая удар на него,«не-здесь .php ", будет ли моя страница, которая называется? Предположительно, я мог бы как-то использовать «If (status ==», чтобы сравнить текущую версию этой страницы с последней загруженной версией и, если она отличается, поставить бит обновления кода между самыми внутренними фигурными фигурными скобками? Два вопроса, использовать для проверки текущей версии в отношении последней загруженной версии matchdetailsbase.php и где я бы установил интервал, чтобы проверить это? BTW, ссылка была чем-то, что я уже видел, но используя вызовы в базу данных для проверки обновлений. –

+0

Я отредактировал, посмотрим, поможет ли это. – rcsole

+0

Я определенно думаю, что понимаю логику. Он загружает контент изначально, проверяет каждые 90 секунд, чтобы увидеть, изменилось ли содержимое в matchdetailsbase.php через '(textStatus == "notmodified")'. Если это правда, он ничего не делает, кроме как false, обновится? У меня нет времени, чтобы реализовать это еще (так как я на самом деле ушел, чтобы посмотреть игру), но сегодня вечером он уйдет. Единственный бит, который меня смущает, это бит textStatus == «notmodified». Не изменен термин, признанный jQuery, или это просто код psuedo, и мне придется реализовать там свои собственные критерии? Спасибо за помощь. –

3

После прочтения вопроса, если я понимаю проблему, с которой вы столкнулись правильно, решение не должно выполняться в части jquery. Решение можно найти в php-части. Как вы сказали, основная проблема заключается в том, что сервер забивает из-за запросов на matchdetailsbase.php. Поэтому, даже если вы правильно реализуете решение rcsole, ваша php-страница будет по-прежнему ударяться по каждому тику таймера, который, в свою очередь, запускает весь код и все равно заставляет вас забивать ваши серверы.

Долгосрочное решение, конечно, представляет собой комбинацию изменений запроса/дБ и некоторых агрессивных методов кеширования. Но так как вы упомянули, что это краткосрочное решение для стоп-лока, которое вы ищете, я бы предложил пойти с хорошим кэшированием на основе php. Ниже приведены некоторые ссылки, чтобы указать вам правильное направление для кэширования вывода.

http://php.dzone.com/news/php-caching-pages-with-output-

Caching HTML output with PHP

Основная теория состоит в том, что вы сохраняете выход вашего PHP-скрипта в статическом файле, а затем служить содержимое файла в течение следующих х секунд. Таким образом, независимо от того, сколько раз ваш php-скрипт вызывается от клиента, содержимое генерируется только один раз каждые x секунд. Это должно снизить обработку, которую должен обрабатывать ваш сервер - надеюсь. Помните, что это всего лишь краткосрочное решение. В вашем случае я бы предложил сохранить продолжительность кэширования примерно на 120-180 секунд.

Это в дополнение к решению rscole «ы должны помочь вам держаться, пока вы не улучшить общий дизайн ...

Смежные вопросы