Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > [php] поставить ограничение на выполнение скрипта


Автор: zloyGamer 12.11.2010, 14:16
над ограничить количество загрузок одной и тойже страницы в определ. промежуток времени,
если юзер по нескольку раз перезапрашивает одну и туже страницу, то выдавать ему последний вариант а выполнение остальных(запрошенных до этого) обрубать!

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

вот к примеру мой бесполезный вариант на сессиях:
Код

function load_wait($wait_time = 2000)
{//задаем время в мс. за которое можно загрузить эту страницу не более 1 раза
  $time_start = microtime(1);
  session_start();
  
  $var_counter   = 'load_count';
  $var_prev_load = 'prev_load_time';
  
  if (!isset($_SESSION[$var_counter]))
  {
    $_SESSION[$var_counter] = 1;
    $_SESSION[$var_prev_load] = microtime(1);
    return;
  }
  $_SESSION[$var_counter]++;
  
  $query_count = $_SESSION[$var_counter];

  
  if (!isset($_SESSION[$var_prev_load]))
  {//хз как, но такое тож случаецо
    $_SESSION[$var_prev_load] = microtime(1);
  }
  
  $prev_time = $_SESSION[$var_prev_load];
  
  $wait_need = $wait_time-round((microtime(1)-$prev_time)*1000,0);
  if($wait_need>0)
  {
    //echo "wait $wait_need ms ... <br>";
    usleep($wait_need);//usleep похоже невсегда срабатывает
    $wait_need = $wait_time-round((microtime(1)-$prev_time)*1000,0);
    if($wait_need>1000)
      sleep($wait_need/1000);
  }
  
  $log_file = "log/$var_counter.query_close";
  
  if($query_count<$_SESSION[$var_counter])
  {//если после ожидания были ещё попытки загрузить данные то эта попытка уже не ф щёт
    writeToFile($log_file,"ab","$var_counter == $query_count / ".$_SESSION[$var_counter]."\n");
    return 0;
  }
  writeToFile($log_file,"ab","test return 1\n");
  $_SESSION[$var_prev_load] = microtime(1);
  return 1;
}
//далее в начале страницы вставляем:
if(load_wait(5000)==0) exit(0);

в этом скрипте я рассчитывал на то что значение $_SESSION[$var_counter] при каждом её запросе каждый раз обновляется и выдает текущее значение для всех запущеных скриптоф, но как выяснилось это не так, получается в скрипте у неё тока последнее значение переменной сесси... или может йа чего не учел/незнаю.

подскажите если не лень/не жалко/не в лом какойнить толковый вариантец на такой случай

Автор: zloyGamer 13.11.2010, 09:02
ну кто нибудь.., неужели никто не сталкивался? 
полюбому каждый, (или как минимум через одного )), пхпшник както решал подобное...

Автор: bars80080 13.11.2010, 14:50
выставлять кэш на нужный промежуток времени? пускай браузер вообще не пускает запросы в сеть

а иначе это придётся сохранять страницу в статическом варианте и отдавать уже её. стоит ли оно того?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)