Ru-MaNGOS

Ru-MaNGOS (http://mangos.ytdb.ru/index.php)
-   WWW (http://mangos.ytdb.ru/forumdisplay.php?f=23)
-   -   Работа с DataLife Engine (http://mangos.ytdb.ru/showthread.php?t=1899)

Праведник 24.07.2010 15:20

Работа с DataLife Engine
 
1. Введение

Список переменных и классов DLE которые вы можете использовать в вашем подключаемом модуле, без дополнительного объявления:

$is_logged - содержит информацию, является ли посетитель авторизованным пользователем или гостем, и содержит значения true или false.
$member_id - содержит массив с информацией о авторизованном пользователе, включая всю его информацию из профиля.
$db - класс DLE для работы с базой данных.
$tpl - класс DLE для работы с шаблонами.
$cat_info - массив содержащий информацию обо всех категориях на сайте.
$config - массив содержащий информацию обо всех настройках скрипта.
$user_group - массив содержащий информацию о всех группах пользователей и их настройках.
$category_id - содержит ID категории которую просматривает посетитель.
$_TIME - содержит текущее время в UNIX формате с учетом настроек смещения в настройках скрипта.
$lang - массив содержащий текст из языкового пакета.
$smartphone_detected - содержит информацию о том, просматривает ли пользователь сайт со смартфона или с обычного браузера, и содержит значения true или false.
$dle_module - содержит информацию о разделе сайта, который просматривает пользователь, либо информацию переменной do из URL браузера.
Внимание: Ваш модуль должен только читать данные из данных переменных, внесение изменений в значения переменных повлечет сбои в работе стандартных возможностей скрипта и дальнейшей его некорректной работе.

2. Создание модулей для DLE

2.1 Разберём, для начала, создание модуля в качестве блока, который затем можно вставить в любую часть вашего шаблона.



2.2 Но если же нам мало одного блока, а хотим, к примеру, чтобы наш модуль занимал всю страницу, то поступаем след. образом:


Праведник 24.07.2010 15:20

3. Кеширование

Распределение нагрузки - весьма важная часть в работе любого веб-мастера. Со временем растёт ваш сайт, растёт, а вместе с ним растёт и нагрузка. Один из самых простых и действенных способов её снизить - кеширование результатов. В DLE есть встроенные инструменты для кеширования, но мы пойдём по длинному пути.
1 Из моих знакомых написал весьма простенький, но в тоже время действенный класс для кеширования.



Сохраняем его в папке /engine/ именем cacheClass.php
Разберём его применение на созданных нами ранее модулях:

3.1. Кеширование модуля, созданного в качестве блока:



3.1. Кеширование модуля, созданного в качестве страницы:


Праведник 24.07.2010 15:26

4. Примеры (Подготовка)

1. Конфиг
Под все модули будет общий и будет распологаться в папке /config/ , которая находится в директории сайта (корень).



2. Массивы
будут находиться в папке /engine/modules/wow/includes/array/
Всего нами будет использовано 2 массива: массив локаций, массив персонажей и классов

Содержание массива персонажей
Содержание массива зон

3. Функции
Функции сложим в папочку /engine/modules/wow/includes/functions/ под именем func.php



4. Класс кеширования
Класс для кеширования данных мы разбирали выше.
Закидываем в папку /engine/ файлик cacheClass.php

Праведник 24.07.2010 15:37

5. Примеры
Для особо ленивых буду комментировать свои действия, но тут всё и так понятно без лишних слов...

5.1 Создаём модуль PVP-рейтинга на базе отдельной страницы.




5.2. Создаём модуль "задротов" на базе отдельной страницы


Праведник 24.07.2010 15:37

5.3. Рейтинг богачей на базе отдельной страницы



5.4. Создаём модуль отображения гейм мастеров в сети на базе отдельной страницы.


Праведник 24.07.2010 15:40

5.5. Создаём модуль статистики на основе блока




Думаю, примеров довольно. Если что-то осталось непонятным, спрашиваем.

P.S. во избежание разного рода какашек в мой адрес: материал авторский (за исключением списка из первого поста (взят с оф. сайта DLE))

alien 24.07.2010 16:01

PHP код:

$aSql mysql_num_rows(mysql_query("SELECT `id` FROM `account`"$sMySql)); 

Ого какой оптимальный код )
"SELECT count(`id`) FROM `account`
как-бы так правильнее )
и дальше тоже через count
PHP код:

$aSql mysql_num_rows(mysql_query("SELECT `guid` FROM `characters` WHERE `online` IN ( 1 )"$sMySql));
   
$nCurrenOnline $aSql;;
   
$aSql mysql_num_rows(mysql_query("SELECT `guid` FROM `characters` WHERE `online` IN ( 1 ) and `race` IN (6, 10, 5, 2, 8)"$sMySql));
   
$OnlineHorde $aSql;
   
$aSql mysql_num_rows(mysql_query("SELECT `guid` FROM `characters` WHERE `online` IN ( 1 ) and `race` IN ( 1, 4, 11, 3, 7 )"$sMySql));
   
$OnlineAlliance $aSql

Дальше function conventNormTime($nSec)
а чем вас не устроила стандартная PHP функция date ( string $format [, int $timestamp ] )

Праведник 24.07.2010 16:08

Цитата:

Дальше function conventNormTime($nSec)
а чем вас не устроила стандартная PHP функция date ( string $format [, int $timestamp ] )
в realmd хранится разница во времени, а не время. Для справки.

Цитата:

Ого какой оптимальный код )
"SELECT count(`id`) FROM `account`
как-бы так правильнее )
Разницы не замечал. mysql_num_rows выводит тоже нужное числовое значение. Попробуете доказать быстродействие какой-либо функции, подумаем над грамотностью кода.

alien 24.07.2010 16:14

Доказать быстродействие легко.
Что делает ваш запрос.
Правильно он извлекает и передает список ID в скрипт на пхп который потом считает сколько записей ему вернул майскуль.
а что делает запрос SELECT count(`id`) FROM `account`. Правильно он запрашивает у майскуля сколько записей и возвращает это число.
Дальше сами подумайте что будет быстрее.

Праведник 24.07.2010 16:23

думать можно по-разному и не всегда то, что кажется верным, таковым и является.

За пример взял таблицу с 19 тысячами записей и выбирал по 1 полю.
Выборка с помощью mysql_num_rows занимает 0.0005 сек. С использованием count теже 0.0005 сек.
Подсчитать кол-во строк для веб-сервера не займёт и тысячной доли секунды. Так что плюсы весьма и весьма сомнительные.

alien 24.07.2010 16:23

Отгадайте что вернет
Цитата:

echo date("z-H-s",161984);
1(дней)-23(часов)-44(секунд)
а ваш код с погрешностью работает притом нехилой
UPD:
SELECT SQL_NO_CACHE count(`guid`) FROM `creature`;
и
SELECT SQL_NO_CACHE `guid` FROM `creature`;
Выполните эти 2 запроса и сравните время выполнения в томже навикате

ghostpast 24.07.2010 16:31

Цитата:

Сообщение от Праведник (Сообщение 11222)
думать можно по-разному и не всегда то, что кажется верным, таковым и является.

За пример взял таблицу с 19 тысячами записей и выбирал по 1 полю.
Выборка с помощью mysql_num_rows занимает 0.0005 сек. С использованием count теже 0.0005 сек.
Подсчитать кол-во строк для веб-сервера не займёт и тысячной доли секунды. Так что плюсы весьма и весьма сомнительные.

при использовании функции mysql_num_rows() будет больше трафика, так как на веб-сервер придут все записи.
при использовании в запросе функции count() на веб-сервер придет только одна запись - количество записей в таблице.

Праведник 24.07.2010 16:33

Текущий аптайм: 0 д. 9 ч. 0 м.

значение в timestamp - 32403

PHP код:

<?
echo date("z-H-s",32403);
?>

0-12-03

ваш вариант, безусловно, лучший :)

Праведник 24.07.2010 16:38

Вложений: 2
не поленился и выполнил ваши запросы.

LordJZ 24.07.2010 16:40

Цитата:

Сообщение от alien (Сообщение 11218)
PHP код:

$aSql mysql_num_rows(mysql_query("SELECT `id` FROM `account`"$sMySql)); 

Ого какой оптимальный код )
"SELECT count(`id`) FROM `account`
как-бы так правильнее )
...

Ого, какой оптимальный код!
Код:

SELECT COUNT(*) FROM account
Как бы, так быстрее и логически правильнее.

alien 24.07.2010 16:41

Почему некто нехочет читать дки.
date_default_timezone_set('UTC');
echo date("z(дней)-H(часов)-s(секунд)",32403);

Праведник 24.07.2010 16:41

LordJZ, выше результат выполнения 2х разных подходов. Быстрее?

alien 24.07.2010 16:42

Цитата:

не поленился и выполнил ваши запросы.
Ой ЛОЛ
а вы не видите что пхпмай одмин дававил к запросу?

Праведник 24.07.2010 16:43

Цитата:

Сообщение от alien (Сообщение 11229)
Почему некто нехочет читать дки.
date_default_timezone_set('UTC');
echo date("z(дней)-H(часов)-s(секунд)",32403);

спасибо, мой косяк.


Цитата:

Ой ЛОЛ
а вы не видите что пхпмай одмин дававил к запросу?
отменно видим. Уберите лимит и получите точно такой же результат с немного большим цифровым значением, но ровный.
Считает-то он в любом случае всё. А выводит.. ну пускай выводит сколько хочет. Нам ведь не это главное, не правда ли?

alien 24.07.2010 16:45

LordJZ, согласен но тут разница в десятитысяцные )

alien 24.07.2010 16:48

http://img687.imageshack.us/gal.php?g=sqll.jpg
тогда выкиньте пхп май админ.

Праведник 24.07.2010 16:50

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

alien 24.07.2010 16:51

Вложений: 2
Вот держите

Праведник 24.07.2010 16:56

Даже спрашивать не стану о столь существенной разнице выполнения между двумя вариантами (мой/ваш). Но, дабы положить конец этой бессмысленной теме, сейчас переделаю каунтом все запросы.

24.07.2010 16:57

Цитата:

Сообщение от LordJZ (Сообщение 11228)
Ого, какой оптимальный код!
Код:

SELECT COUNT(*) FROM account
Как бы, так быстрее и логически правильнее.

Код:

SELECT COUNT(1) FROM account
будет быстрее, можно долго оптимизировать =)))
был бы смысл...экономия сотых процентов производительности в большинстве своём не стоит затрат на оптимизацию

alien 24.07.2010 17:14

А вы поставьте Навикат и выполните запросы там.
Я вот поставил пхп май админ и вижу что он такую чушь делает
Да и мне страшно представить сколько у вас страница грузилось если вы лимит убрали.
Он же пробовал показать все ид)

Цитата:

Считает-то он в любом случае всё. А выводит.. ну пускай выводит сколько хочет. Нам ведь не это главное, не правда ли?
Вот именно что он выводи. Тоесть генерирует лезультат и хранит у себя в памяти(кстати трафик не гонятеся так-как mysql_num_rows() делает запрос к серверу и он возвращает тоже только результат(тоесть число записей))
Но вот сервер ХРАНИТ у себя результат запроса. То есть все 100к строк.
а представьте что у вас в секунду 50 таких запросов будет?
Цитата:

экономия сотых процентов производительности в большинстве своём не стоит затрат на оптимизацию
Это не экономия это вкорне неправильный запрос с точки зрения логике.

Праведник 24.07.2010 17:20


alien 24.07.2010 17:24

Ну вот а теперь представьте что вы сервер.
Вам говорят выдайка мне ид из таблички такойто но при этом всего 30 штук.
Что сервер будет делать. Правильно он грубо говоря просто пробежит по 30 записям и вернет их.
А теперь верника мне ВСЕ записи из таблици. Что будет делать сервер. Правильно он будет по всем записям бежать.
А вот если мы запрашиваем. Сервер а скажи ка мне сколько у тебя там всего записей.
Сервер же не дурак чтобы бежать по всем записям и считать их. Он просто(грубо говоря) возвращает число записей.

Праведник 24.07.2010 17:35



Ещё замечания?

fr3ak 24.07.2010 21:28

я хз почему...
 
непонимаю в чем собственно просак, я нашел тему от самого разработчика этих модулей....

меня беспокоит эта ошибка:
Parse error: syntax error, unexpected T_SL in
Z:\home\test1.ru\www\engine\modules\wow\short_stat s.php on line 87


А вот собственно и значение данной строки:
Код:

  $nCurrenOnline = $nCurrenOnline." ". number_ending($nCurrenOnline, "игроков", "игрок", "игрока");
short_stats.php без пробела, тут форум глючит походу...

Праведник 24.07.2010 21:58

я как бы и есть разработчик этих модулей :)
в данной строке нет ошибок.

fr3ak 24.07.2010 22:09

RE:
 
Вложений: 1
В данной строке нет ошибок
а в целом в странице есть :yes3:
я все отредактировал, все работает, а мне нужна только таблица подобного рода под статистику

...
Посмотри плз файл во вложении, это и есть тот самый файл php

Праведник 24.07.2010 22:22

Вложений: 1
:yes3:

fr3ak 24.07.2010 22:43

заполонил ошибками )
 
Код:

Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in Z:\home\test1.ru\www\engine\modules\wow\short_stats.php on line 21
Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in Z:\home\test1.ru\www\engine\modules\wow\short_stats.php on line 27
Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in Z:\home\test1.ru\www\engine\modules\wow\short_stats.php on line 32
Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in Z:\home\test1.ru\www\engine\modules\wow\short_stats.php on line 37
Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in Z:\home\test1.ru\www\engine\modules\wow\short_stats.php on line 43
Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in Z:\home\test1.ru\www\engine\modules\wow\short_stats.php on line 47
Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in Z:\home\test1.ru\www\engine\modules\wow\short_stats.php on line 56
Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in Z:\home\test1.ru\www\engine\modules\wow\short_stats.php on line 64
Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in Z:\home\test1.ru\www\engine\modules\wow\short_stats.php on line 66
Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in Z:\home\test1.ru\www\engine\modules\wow\short_stats.php on line 68
Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in Z:\home\test1.ru\www\engine\modules\wow\short_stats.php on line 74


Праведник 24.07.2010 22:47

нету подключения к мускулю.

fr3ak 24.07.2010 23:08

Цитата:

Сообщение от Праведник (Сообщение 11275)
нету подключения к мускулю.


да нет уж
подключение есть, вот только просак в том что этот error code выводится сверху от общей страницы сайта, а в header по умолчанию уже вшивается {short_stats}

http://img507.imageshack.us/img507/56/debug.jpg

как раз беда в time директивах

Праведник 24.07.2010 23:32

там с кодировкой косяк.

http://ru-mangos.ru/showpost.php?p=11229&postcount=16 альтернатива

fr3ak 24.07.2010 23:42

RE
 
Цитата:

Сообщение от Праведник (Сообщение 11282)
там с кодировкой косяк.

Можно еще тупой вопрос...куда это вписать
сорри за такой банальный вопрос, просто уже весь день плюхаюсь с движками, голова не пашет %) :mda:

LordJZ 24.07.2010 23:44

Цитата:

Сообщение от fr3ak (Сообщение 11276)
да нет уж
подключение есть, вот только просак в том что этот error code выводится сверху от общей страницы сайта, а в header по умолчанию уже вшивается {short_stats}

...

как раз беда в time директивах

mysql_num_rows и mysql_fetch_array ожидают первый аргумент в виде результата от вызова mysql_connect. У вас он вернул boolean, очевидно — false, что говорит о том, что подключение не создалось.

А на вашем скриншоте я вижу нули во всех полях, включая время, что так же может свидетельствовать о некорректном соединении.

fr3ak 25.07.2010 02:06

статус блок скушал мои {info}{content}

Код:

$tpl->result['content'] = $szStatus;
это в short_stats.php модуле

как добавить чтобы он выводил в результате не только статус но и после выдавал само содержимое контента страницы?

при этом в Index.php указывается следующая строчка
Код:

$tpl->set ( '{content}', "<div id='dle-content'>" . $tpl->result['content'] . "</div>" );





а всё, разобрался! :declare:
в short_stats.php написал:
Код:

$tpl->result['short_stats'] = $szStatus;
в index.php дописал связи:
Код:

$tpl->set ( '{content}', $content );
$tpl->set ( '{short_stats}', $szStatus);

и потом докрутил {short_stats} в движок через <div>
=)
и получилось :)
Однако проблема со временем , точнее с его отображением - еще не решена :(


Текущее время: 21:11. Часовой пояс GMT +3.

ru-mangos.ru - Русское сообщество MaNGOS