• Страница 1 из 1
  • 1
Модератор форума: LightInDarkness  
[Скрипт] Cтатистика онлайна
Quintessence
Центурион
И так господа, я решил поделиться с вами небольшим скриптом, который существенно облегчит нагрузку на базу данных со стороны сайта.
Как "оно" работает:
Цитата

1. Открывает файл и читает из него время, если время в файле меньше текущего, переходит к пункту 2, иначе к пункту 3.
2. Делает 2 запроса в базу, записывает новые данные в файл с новой датой, выводит пользователю свежую статистику.
3. выводит пользователю уже ранее записаные данные.

и вот вам сам код:
Код

<?php
header("Content-Type: content=text/html; charset=cp1251");
######
# Конфиг
######
$realm_name[1] = ''; //Название сервера
$dbip[1] = ''; //ip бд
$dblogin[1] = ''; // логин бд
$dbpass[1] = ''; // пароль бд
$cdb_name[1] = '';
$referesh_delay = 5;
$num_realms = 1;
######
$servers = file("./online.txt");
for($i=1;$i<=$num_realms;$i++){
$serv_num = $i-1;
$last_state = explode(",", $servers[$serv_num]);
if($last_state[2] < time()){
$online['all'][$i] = @mysql_result(@mysql_query("SELECT count(guid) FROM `".$cdb_name[$i]."`.`characters` WHERE online = 1", $Connectdb[$i]), 0);
$online['horde'][$i] = @mysql_result(@mysql_query("SELECT count(guid) FROM `".$cdb_name[$i]."`.`characters` WHERE online=1 and race in (2,5,6,8,10,9)", $Connectdb[$i]), 0);
$online['allnc'][$i] = $online['all'][$i]-$online['horde'][$i];
$realmname[$i] = $realm_name[$i];
$time = time()+$referesh_delay;
$servers_file .= $online['allnc'][$i].",".$online['horde'][$i].",".$time.",".$realm_name[$i]."\n";
}else{
$online['horde'][$i] = $last_state[1];
$online['allnc'][$i] = $last_state[0];
$online['all'][$i] = $online['horde'][$i]+$online['allnc'][$i];
$realmname[$i] = $last_state[3];
}
echo "Орда:".$online['horde'][$i]." Альянс:".$online['allnc'][$i]." Всего:".$online['all'][$i];
}
if($last_state[2] < time()){
@file_put_contents("./online.txt", $servers_file);
}
?>

Правил на ходу, но должно работать.
Этот кусок выдран у меня из CMS.
Изменяйте на здоровье
Уникальный рейтинг серверов http://rtop.biz
RTOP на WoWJP
Сообщение # 1 отредактировано Sherlоck - Среда, 05.02.2014, 19:01
iUnro
root@localhost
Quote
@
нельзя так делать. Используйте try ... catch или if ... else (лучше первый вариант)
Сообщение # 2 написано 10.09.2012 в 17:41
Кот_ДаWINчи
Чемпион
товарищ... это называется кэширование данных. и твой "скрипт" делает что-то подобное кэширования статистики онлайна. Это конечно похвально, но лучше не размениваться по мелочам, а написать класс кэширования, который можно встроить в любой модуль и кэшировать любые данные на сайте.
мне фиолетово какой у меня рейтинг, можете поставить хоть минус миллион...
Не в плюсах счастье...
Помогаю тем, кто хочет чтобы ему помогли, а не сделали за него.
Сообщение # 3 написано 10.09.2012 в 17:47
Quintessence
Центурион
Кот_ДаWINчи, господин, я знаю, что это называется кэширование...
Над написанием класса я пока не задумывался, т.к. еще пока не придумал, что еще кэшировать:)
Вобщем, я сделал попытку подкинуть идею и ничего более.
Ну и к тому же у меня сейчас у самого на сервере онлайна то нет, и нужды особой нет в этом скрипте...
А так хоть кто-нибудь ,может, и использует.
Пишу попутно отвечая iUnro.
Уникальный рейтинг серверов http://rtop.biz
RTOP на WoWJP
Сообщение # 4 написано 10.09.2012 в 17:58
Нолан
Скаут
1. Если указывать именно так:
Quote
header("Content-Type: content=text/html; charset=cp1251");

то браузер будет отдавать страницу на загрузку, так как типа "content=text/html" не существует. Есть только text/html.

Правильно писать:
Quote
header("Content-Type: text/html; charset=cp1251");

P.S: Я бы предложил использовать кодировку utf-8, а не cp1251 (Тем более сама база в этой кодировке, ну и из за плюсов в количестве символов и её нормальной поддержке в новых версиях php).

2. Не инициализирована переменная: servers_file. Сразу делается конкатенация с не инициализированной переменной.

3. Ошибки не нужно глушить. Их нужно обрабатывать. Особенно ошибки выполнения запросов. Также стоит добавить обработку, если отсутствует файл online.txt. Например создавать его и потом продолжать работу скрипта, или не делать чтение из файла до того, как его создадут после первого запроса в базу.

4. Вряд ли задержка в 1 секунду поможет базе. Тем более результат time() нужно заносить в переменную, так как время не стоит на месте во время выполнения скрипта и в конце скрипта будет нечего писать потому, что переменной не существует (если к концу файла прошла секунда, а в начале last_state[2] == time()).

5*. Конечно понимаю что это вырезано из некой "CMS", но раз выкладываешь скрипт, то позаботься хотя бы об использовании всех переменных и подключении к базе.
Сообщение # 5 отредактировано Нолан - Понедельник, 10.09.2012, 21:39
Quintessence
Центурион
cp1251 используется мною только по причине того, что, когда я начал писать кмс я забыл сменить кодировку файла:)
Кому надо, тот допишет.
По поводу пункта 1, то признаю, моя очепятка.
А вот я не хочу в этом скрипте обрабатывать ошибки, я хочу, чтобы он выводил одни и те-же данные в течении нескольких секунд независимо от реальных значений в базе.
4.По-вашему, что значит переменная refresh_delay?
Уникальный рейтинг серверов http://rtop.biz
RTOP на WoWJP
Сообщение # 6 написано 11.09.2012 в 07:39
RazArt
Тазовод
Quote
начал писать кмс

Quote
$online['horde'][$i] = @mysql_result(@mysql_query("SELECT count(guid) FROM `".$cdb_name[$i]."`.`characters` WHERE online=1 and race in (2,5,6,8,10,9)", $Connectdb[$i]), 0);

cranky
DumpMe v1.0 - система автоматического переноса персонажей

Вышла в свет первая стабильная версия. Писать в скайп - razart8
Сообщение # 7 написано 11.09.2012 в 09:11
Quintessence
Центурион
RazArt, вы придираетесь.
Уникальный рейтинг серверов http://rtop.biz
RTOP на WoWJP
Сообщение # 8 написано 11.09.2012 в 09:41
DioNiR
Скаут
А зачем пихать время изменения в файл Оо
Неужели сложно проверить функцией filemtime время последнего изменения и по нему уже определять?
Сообщение # 9 написано 11.09.2012 в 09:50
rondor
Скаут
Сообщение # 10 написано 11.09.2012 в 12:41
  • Страница 1 из 1
  • 1
Поиск: