LGSL (обновление серверов)

Ответить
Crank174RuS
Сообщения: 66
Зарегистрирован: 19.09.2010
Как сделать чтобы при нажатии на ссылку запускалось обновление серверов с отчетом времени.
Как вот сдесь mg.amxservera.ru/servers/refresh/

Аватара пользователя
Distructor
Администратор
Сообщения: 1607
Зарегистрирован: 28.12.2009
В стандартном движке LGSL при открытии страницы проверяется устарел ли сохраненный ранее кэш или нет. Если устарел - информация обновляется и записывается в кэш.

На приведенном тобой сайте кэш дополнительно можно обновить принудительно нажав на эту кнопку.

Обновление информации при открытии страницы при большом числе серверов, занимает довольно значительное время и пользователи могут закрыть твой мониторинг даже не дождавшись пока он откроется. Поэтому в http://mon.v-tanke.ru и при доработке мониторинга mkden, обновление информации было вынесено в отдельный файл и вызывается автоматически через установленные промежутки времени, в результате чего пользователь сразу получает актуальную информацию. И если он через пару минут обновит страницу, то опять же сразу отобразится текущая информация.

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

А отсчет времени сделан на JavaScript и нужен только лишь для того чтоб показать тебе надпись и вернуться назад к списку серверов.

Аватара пользователя
Distructor
Администратор
Сообщения: 1607
Зарегистрирован: 28.12.2009
Описание актуально для LGSL 5.7 в более новых версиях мог измениться порядок аргументов или названия функций,
так что проверяйте их перед заменой.
заменяем lgsl_cron.php на

Код: Выделить всё

<?php

 /*-------------------------------------------------------------------------------------------------\
 |                                                                                                  |
 |                 [ LIVE GAME SERVER LIST ] [ . RICHARD PERRY FROM GREYCUBE.COM ]                  |
 |                                                                                                  |
 |                optimize for external cron by Creaternal (http://coder.v-tanke.ru)                |
 |                                                                                                  |
 \-------------------------------------------------------------------------------------------------*/

//------------------------------------------------------------------------------------------------+

  require "lgsl_class.php";
  lgsl_database();
  global $lgsl_config;

//------------------------------------------------------------------------------------------------+
// CRON SETTINGS:

  @set_time_limit(3600);           // MAXIMUM TIME THE CRON IS ALLOWED TO TAKE

  $lgsl_config['cache_time'] = 60; // HOW OLD CACHE MUST BE BEFORE IT NEEDS REFRESHING

  $request = "sep";                // WHAT TO PRE-CACHE: [s] = BASIC INFO [e] = SETTINGS [p] = PLAYERS

//------------------------------------------------------------------------------------------------+

  $mysql_query  = "SELECT `type`,`ip`,`c_port`,`q_port`,`id` FROM `{$lgsl_config['db']['prefix']}{$lgsl_config['db']['table']}`  WHERE `disabled`=0 ORDER BY `cache_time` ASC";
  $mysql_result = mysql_query($mysql_query) or die(mysql_error());

  while($mysql_row = mysql_fetch_array($mysql_result, MYSQL_ASSOC))
    lgsl_do_cron($mysql_row['type'], $mysql_row['ip'], $mysql_row['c_port'], $mysql_row['q_port'], $mysql_row['id'], $request);

//------------------------------------------------------------------------------------------------+

?>
затем в lgsl_class.php добавляем функцию

Код: Выделить всё

  function lgsl_do_cron($type, $ip, $c_port, $q_port, $id, $request)
  {
    global $lgsl_config;

    lgsl_database();

    $cache         = array();
    $cache_time    = array(0,0,0);
    $cache      = array();
    // SET THE SERVER AS OFFLINE AND PENDING WHEN THERE IS NO CACHE
    $cache['b'] = array();
    $cache['b']['status']  = 0;
    $cache['b']['pending'] = 1;
    $cache['b']['type']    = $type;
    $cache['b']['ip']      = $ip;
    $cache['b']['c_port']  = intval($c_port);
    $cache['b']['q_port']  = intval($q_port);
    $cache['b']['s_port']  = 0;
    
    $cache['o']['request'] = $request;
    $cache['o']['id']      = $id;
    $cache['o']['zone']    = 0;
    $cache['o']['comment'] = '';
    
    $cache['s']               = array();
    $cache['s']['game']       = $type;
    $cache['s']['name']       = $lgsl_config['text']['nnm'];
    $cache['s']['map']        = $lgsl_config['text']['nmp'];
    $cache['s']['players']    = 0;
    $cache['s']['playersmax'] = 0;
    $cache['s']['password']   = 0;

    $cache['e'] = array();
    $cache['p'] = array();

    if ($request)
    {
      $live = lgsl_query_live($type, $ip, $c_port, $q_port, $s_port, $request);
      // CHECK AND CONVERT TO UTF-8 WHERE NEEDED
      $live = lgsl_charset_convert($live, lgsl_charset_detect($live));

      // IF SERVER IS OFFLINE PRESERVE SOME OF THE CACHE AND CLEAR THE REST
      if (!$live['b']['status'])
      {
        $live['s']['game']       = $cache['s']['game'];
        $live['s']['name']       = $cache['s']['name'];
        $live['s']['map']        = $cache['s']['map'];
        $live['s']['password']   = $cache['s']['password'];
        $live['s']['players']    = 0;
        $live['s']['playersmax'] = $cache['s']['playersmax'];
        $live['e']               = array();
        $live['p']               = array();
      }

      // MERGE LIVE INTO CACHE
      if (isset($live['b'])) { $cache['b'] = $live['b']; }
      if (isset($live['s'])) { $cache['s'] = $live['s']; $cache_time[0] = time(); }
      if (isset($live['e'])) { $cache['e'] = $live['e']; $cache_time[1] = time(); }
      if (isset($live['p'])) { $cache['p'] = $live['p']; $cache_time[2] = time(); }

      // UPDATE CACHE
      $packed_cache = mysql_real_escape_string(base64_encode(serialize($cache)));
      $packed_times = mysql_real_escape_string(implode("_", $cache_time));
      $mysql_query  = "UPDATE `{$lgsl_config['db']['prefix']}{$lgsl_config['db']['table']}` SET `status`='{$cache['b']['status']}',`cache`='{$packed_cache}',`cache_time`='{$packed_times}' WHERE `id`=$id LIMIT 1";
      $mysql_result = mysql_query($mysql_query) or die(mysql_error());
    }

    return true;
  } 
которая является урезанной версией lgsl_query_cached

далее в функции lgsl_query_cached комментируем часть отвечающую за проверку необходимости опроса сервера.
заменяем

Код: Выделить всё

    // CHECK WHAT IS NEEDED

    $needed = "";

    if (strpos($request, "c") === FALSE) // CACHE ONLY REQUEST
    {
      if (strpos($request, "s") !== FALSE && time() > ($cache_time[0]+$lgsl_config['cache_time'])) { $needed .= "s"; }
      if (strpos($request, "e") !== FALSE && time() > ($cache_time[1]+$lgsl_config['cache_time'])) { $needed .= "e"; }
      if (strpos($request, "p") !== FALSE && time() > ($cache_time[2]+$lgsl_config['cache_time'])) { $needed .= "p"; }
    } 
на

Код: Выделить всё

    // CHECK WHAT IS NEEDED

    $needed = "";

//    if (strpos($request, "c") === FALSE) // CACHE ONLY REQUEST
//    {
//      if (strpos($request, "s") !== FALSE && time() > ($cache_time[0]+$lgsl_config['cache_time'])) { $needed .= "s"; }
//      if (strpos($request, "e") !== FALSE && time() > ($cache_time[1]+$lgsl_config['cache_time'])) { $needed .= "e"; }
//      if (strpos($request, "p") !== FALSE && time() > ($cache_time[2]+$lgsl_config['cache_time'])) { $needed .= "p"; }
//    }       
ну и напоследок настраиваем cron или nnCron чтобы он вызывал lgsl_cron.php каждые 5 минут

Ответить