За последние 24 часа нас посетили 30609 программистов и 1801 робот. Сейчас ищут 936 программистов ...

Борьба с частыми запросами

Тема в разделе "MySQL", создана пользователем BurgerVasya, 19 май 2007.

  1. BurgerVasya

    BurgerVasya Активный пользователь

    С нами с:
    19 май 2007
    Сообщения:
    17
    Симпатии:
    0
    Как бороться с недобросовестными юзерами, которые частым кликом по ссылке вызывают мнокократно скрипт для получения незапланированных действий, к примеру:

    PHP:
    1. $query = @mysql_query("select lastupdate from '$table' where id='$userid';");
    2. $user = @mysql_fetch_array($query);
    3. $lastupdate = $user['lastupdate'];
    4.  
    5. if ($lastupdate > (time()-3)) exit();
    6.  
    7. @mysql_query("update '$table' set money=money+1,lastupdate='".time()."' where id='$userid';") or die();
    8. @mysql_query("update '$table2' set userid='$anotheruserid' where userid='$userid';") or die();
    9.  
    10. // Проверка if ($lastupdate > (time()-3) exit(); не дает ощутимых результатов, все равно несколько раз userid начисляет себе money++;
    и попутно вопрос про mysql_close(), ибо не нашел однозначного ответа. Обязательно этой функций завершать соединение с базой при завершении скрипта естественным путем и при завершении функцией exit()? Какие минусы и плюсы при неиспользовании mysql_close()?

    Заранее спасибо знатокам
     
  2. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    BurgerVasya
    форматируйте код соответствующими тегами
     
  3. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    mysql_close() закрывает текущее соединение с базой. например, если скрипт начинает стого, что выбирает огромную выборку, а затем преобразует ее в массив, и дальше парсит его, то имеет смысл закрыть соединение и удалить результат запроса из памяти..
     
  4. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    я бы использовал сессии.

    PHP:
    1. $query=mysql_query($sql);
    2. while($result=mysql_fetch_assoc($query)) {
    3. ...
    4. }
    5.  
    6. $query=null;
     
  5. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    armadillo

    я бы вызвал mysql_free_result($query); =)
     
  6. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    Да, склероз, спасибо.
     
  7. oligarx

    oligarx Активный пользователь

    С нами с:
    23 янв 2007
    Сообщения:
    68
    Симпатии:
    0
    Адрес:
    Украина Львов
    а как насчет кэширования запросов?
     
  8. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    многа букав :)
     
  9. BurgerVasya

    BurgerVasya Активный пользователь

    С нами с:
    19 май 2007
    Сообщения:
    17
    Симпатии:
    0
    спасибо за совет, раньше лочил базы, но нагрузка на серв серьезно возрастала. с сессиями пожалуй получше будет...
     
  10. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда

    1. поставить кеширующий nginx перед апачем. он реально снизит нагрузку на сервер прицентов на 30%.
    2. поставить flooddetect.
    http://php.spb.ru/other/_dima_noflood.php

    я давно его использую. очень помогает.