|
|
|
| привет всем, подскажите пожалуста
над ограничить количество загрузок одной и тойже страницы в определ. промежуток времени,
если юзер по нескольку раз перезапрашивает одну и туже страницу, то нужно выдавать ему последний вариант а выполнение остальных(запрошенных до этого) обрубать!
например если юзер за 10 сек по 20 раз нажимает обновить в браузере или 20 раз меняет значения какихто параметров на странице и посылает запрос то на сервере обрабатывается 20 его запросов, мне надо ограничить чтобы обрабатывался только последний запрос, к примеру за последние 5 секунд!...
с такой задачкой я думаю сталкивался каждый пхпшник и соответственно её неоднократно уже решали, тока вот как спросить об этом гугл я пока хз, поэтому я тут.
если не лень/не жалко/не в лом может у кого уже есть какойнить толковый вариантец на такой случай? | |
|
|
|
|
|
|
|
для: Zombi
(13.11.2010 в 13:32)
| | куда проще обрубить не самый старый, а самый свежий экземпляр.
Поскольку оный будет текущим процессом, и сможет сам себя тихо удушить.
Может даже написать пред этим - "Перестаньте клацать "Обновить" ! Кнопка отвалится!" | |
|
|
|
|
|
|
|
для: Trianon
(13.11.2010 в 13:35)
| | да, еслиб самый свежий то говно вопрос и менябы тут небыло.. )
но надо именно все предыдущие процессы грохнуть от окончания работы которых ничего уже не зависит т.к. они уже не будут отображены в браузере и только очень сдорово напрягают сервер, в моем случае просто здоровски.. я по такому случаю думал на сессиях чтото похожее сделать:
смысл в том чтобы загружать страницу не более 1 раза в заданный промежуток времени и если после загурзки в этот промежуток были ещё запросы то выполнять надо тока последний запрос..
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(ajax_load_wait($id_query,5000)==0) exit(0);
|
но значение $_SESSION[$var_counter] обновляется не динамически а только 1 раз при старте скрипта, и получается в скрипте тока последнее значение переменной сесси...
и из него узнать что запущена этаже страница этимже пользователем невозможно..., ну покрайней мере я незнаю как это сделать )
может тут кто знает? | |
|
|
|
|
|
|
|
для: Zombi
(13.11.2010 в 14:26)
| | >но значение $_SESSION[$var_counter] обновляется не динамически а только 1 раз при старте скрипта, и получается в скрипте тока последнее значение переменной сесси...
>и из него узнать что запущена этаже страница этимже пользователем невозможно..., ну покрайней мере я незнаю как это сделать )
>может тут кто знает?
работайте с файлом напрямую.
работайте с БД. | |
|
|
|
|
|
|
|
для: Trianon
(13.11.2010 в 14:46)
| | вот я уже так и думал, с файлом вариант сразу отпадает т.к. несколько одновременных запросов будут блокировать доступ на запись друг другу,
а с бд мне кажется это будет както дико... хотя эт пока единственный вариант который я вижу на тек. момент.. | |
|
|
|
|
|
|
|
для: Zombi
(13.11.2010 в 15:15)
| | >както дико...
это пять баллов | |
|
|
|
|
|
|
|
для: Zombi
(13.11.2010 в 13:32)
| | это жутко напрягает пользователей. | |
|
|
|