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

zavu

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


Сначала я грешила на то, что запрос долго обрабатывается из-за большого количество уже существующих IP в БД. Полностью почистила таблицу logs, но как грузило, так и грузит. Так что дело не в запросе =/
 
Сколько записей в таблице quotes?
 
очень похоже на отправку форм ботами. переделайте голосовалку например через яву, без форм. может поможет.
 
В quotes чуть больше 1500 цитат.

По поводу переделки голосовалки без форм - не поняла. У нас голосование на ajax. Однако форма обработчика все равно должна присутствовать, иначе результат просто в БД не попадет =/
 
очень похоже на отправку форм ботами. переделайте голосовалку например через яву, без форм. может поможет.
это больше похоже на то, что какойто школьник возомнил себя мега ацким хацкером и решил устроить "ддос", либо же хостер просто начал более каечественно мониторить нагрузку. В любом случае, сейчас это гадание на кофейной гуще.

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

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

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

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

Запрос SELECT * FROM `quotes` WHERE `id` = '$id' - начало ввода данных в базу. Если можно переписать как-то по-другому, подскажите плз =/
 
В 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?
 
У меня на этом аккаунте безлимит стоит, дороже только выделенный сервер =/ А не хотелось бы еще и под этот проект выделенку ставить, если хоть что-то можно оптимизировать...
По поводу школоты - не уверена, уж больно часто это происходит. Вряд ли кто-то будет две-три недели сидеть 24 часа в сутки высматривать моменты включения сайта, чтобы сразу же его вешать.
Да и просто я следила по логам и записям айпишников. Получалось примерно так: заходит человек/2-3 на сайт, голосуют за 5-7 цитат, и голосовалка умирает.
Посещаемость средняя - около 600-1000 уников в сутки, одновременно на сайте сидит человек 20.
Запрос SELECT * FROM `quotes` WHERE `id` = '$id' - начало ввода данных в базу. Если можно переписать как-то по-другому, подскажите плз =/
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 (если он сразу отображается на сайте), если же рейтинг сразу не отображается, можно просто писать "ваш голос принят"
 
Назад
Сверху