пхп-обработчик перегружает сервер?=/

Тема в разделе "PHP", создана пользователем zavu, 27 авг 2011.

Модераторы: latteo
  1. zavu

    zavu

    Регистр.:
    24 сен 2010
    Сообщения:
    180
    Симпатии:
    14
    Сайт-цитатник работал почти год нормально, а последнее время вдруг хостер начал отрубать страницу скрипта обработчика голосований. Ставит на нее разрешение 0000. Только исправляю обратно на 0644, как снова 0000. На вопрос "почему" сказали, что этот скрипт сильно грузит сервер.
    Но дело то в том, что год все работало замечательно, а посетителей, судя по счетчику, весной было куда больше, чем теперь.
    В доказательство мне дали какие-то цифры, но я в них ничего не поняла =/ Помогите перевести на русский понятный, что там за нагрузки: ужас-ужас, или не совсем?
    Вот ответ хостера целиком:
     
  2. Mr.Emm

    Mr.Emm Постоялец

    Регистр.:
    5 май 2008
    Сообщения:
    144
    Симпатии:
    107
    Трудно сказать что могло внезапно вызвать нагрузку, возможно хостеры обновили ПО сервера или настройки, и теперь ваш скрипт не совместим с ним.
    Вы можете предоставить файл "/home/pwbash/public_html/votes.php" на обозрение? Необходимо исследовать исходник чтобы что-то предполагать...
     
  3. zavu

    zavu

    Регистр.:
    24 сен 2010
    Сообщения:
    180
    Симпатии:
    14
    Возможно,и обновлялись. CPanel действительно немного по-другому выглядит и работает...
    Исходник прост как пробка:

    PHP:
    <?php
    require_once "config.php";
    require_once 
    "func.php";

    // Присваиваем переменные 
    $id $_POST['id'];
    $action $_POST['action'];
    $ip getip();

    // Проверка на голосование
    $query mysql_query("SELECT * FROM `logs` WHERE `qid` = '$id' AND `ip` = '$ip'");
    if (
    mysql_num_rows($query)>0)
        {    
        echo 
    "<b>Уже голосовали!</b>";
        }
    else
        {
        
    $query mysql_query("SELECT * FROM `quotes` WHERE `id` = '$id'");
        
    $r mysql_fetch_array($query);
        if(
    $action=="plus"$r['rating']++;
        if(
    $action=="minus"$r['rating']--;
        
    $query mysql_query("UPDATE `quotes` SET `rating` = '$r[rating]' WHERE `id` = '$id'");
        
    $query mysql_query("INSERT INTO `logs` VALUES('$id','$ip')");     
        
    $rate $r['rating'];
        echo 
    "<b>Рейтинг ".$rate."</b>";
        }
    ?>
    Сначала я грешила на то, что запрос долго обрабатывается из-за большого количество уже существующих IP в БД. Полностью почистила таблицу logs, но как грузило, так и грузит. Так что дело не в запросе =/
     
  4. chibit

    chibit Life sucks.

    Регистр.:
    4 дек 2007
    Сообщения:
    420
    Симпатии:
    285
    Сколько записей в таблице quotes?
     
  5. coguar

    coguar Постоялец

    Регистр.:
    4 авг 2007
    Сообщения:
    61
    Симпатии:
    11
    очень похоже на отправку форм ботами. переделайте голосовалку например через яву, без форм. может поможет.
     
  6. zavu

    zavu

    Регистр.:
    24 сен 2010
    Сообщения:
    180
    Симпатии:
    14
    В quotes чуть больше 1500 цитат.

    По поводу переделки голосовалки без форм - не поняла. У нас голосование на ajax. Однако форма обработчика все равно должна присутствовать, иначе результат просто в БД не попадет =/
     
  7. -=Xardas=-

    -=Xardas=-

    Регистр.:
    17 сен 2008
    Сообщения:
    250
    Симпатии:
    58
    это больше похоже на то, что какойто школьник возомнил себя мега ацким хацкером и решил устроить "ддос", либо же хостер просто начал более каечественно мониторить нагрузку. В любом случае, сейчас это гадание на кофейной гуще.

    Насчет скрипта vote.php:
    1. имеется потенциальная sql-injection из за отсутствия фильтрации входящих данных
    2. можно убрать как минимум один запрос к базе, а конкретно: SELECT * FROM `quotes` WHERE `id` = '$id', может поможет.

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

    zavu

    Регистр.:
    24 сен 2010
    Сообщения:
    180
    Симпатии:
    14
    У меня на этом аккаунте безлимит стоит, дороже только выделенный сервер =/ А не хотелось бы еще и под этот проект выделенку ставить, если хоть что-то можно оптимизировать...

    По поводу школоты - не уверена, уж больно часто это происходит. Вряд ли кто-то будет две-три недели сидеть 24 часа в сутки высматривать моменты включения сайта, чтобы сразу же его вешать.
    Да и просто я следила по логам и записям айпишников. Получалось примерно так: заходит человек/2-3 на сайт, голосуют за 5-7 цитат, и голосовалка умирает.

    Посещаемость средняя - около 600-1000 уников в сутки, одновременно на сайте сидит человек 20.

    Запрос SELECT * FROM `quotes` WHERE `id` = '$id' - начало ввода данных в базу. Если можно переписать как-то по-другому, подскажите плз =/
     
  9. chibit

    chibit Life sucks.

    Регистр.:
    4 дек 2007
    Сообщения:
    420
    Симпатии:
    285
    В POST['id'] - цифра?
    Если да, то
    PHP:
    $id intval($_POST['id']);
    Если нет, то
    PHP:
    $id mysql_real_escape_string($_POST['id']);
    PHP:
    // Проверка на голосование 
    $query mysql_query("SELECT null FROM `logs` WHERE `qid` = '$id' AND `ip` = '$ip' LIMIT 1"); 
    PHP:
    else { 
        
    $query mysql_query("SELECT `rating` FROM `quotes` WHERE `id` = '$id' LIMIT 1");
    - это немного оптимизирует нагрузку на БД

    Еще хотелось бы увидеть код функции $ip = getip();

    Для полей qid и ip в logs созданы индексы? И в quotes в поле id?
     
  10. -=Xardas=-

    -=Xardas=-

    Регистр.:
    17 сен 2008
    Сообщения:
    250
    Симпатии:
    58
    PHP:
    <?php
    require_once "config.php";
    require_once 
    "func.php";

    // Присваиваем переменные
    $id intval($_POST['id']);
    $action $_POST['action'];
    $ip getip();

    // Проверка на голосование
    $query mysql_query("SELECT null FROM `logs` WHERE `qid` = '$id' AND `ip` = '$ip' LIMIT 1;");
    if (
    mysql_num_rows($query)>0)
    {
        echo 
    "<b>Уже голосовали!</b>";
    }
    else
    {
        if(
    $action=="plus"
            
    $action "+";
        else 
            
    $action "-";
            
        
    $query mysql_query("UPDATE `quotes` SET `rating` = rating $action 1 WHERE `id` = '$id'");
        
    $query mysql_query("INSERT INTO `logs` VALUES('$id','$ip')");
        
        echo 
    $action;
    }
    дальше меняем обработку клиентского js, и в случаях если приходят + или -, соответственно меняем рейтинг в html (если он сразу отображается на сайте), если же рейтинг сразу не отображается, можно просто писать "ваш голос принят"