Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Общие вопросы по программированию, компьютерный форум
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.08.2010, 22:21   #21
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

А как планируете реализовать динамику во 2-м варианте - имею ввиду ,например, изменение количества пунктов меню(подменю),изменение названий пунктов,и вроде у ТС было подсчитано количество статей-новостей?
Andkorol вне форума Ответить с цитированием
Старый 19.08.2010, 22:34   #22
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

И,как мне кажется - при трассировке первого варианта не совсем корректно учитывать вот эти моменты:
PHP код:
$database mysql_connect ("-------""-----","------");
mysql_select_db("------"$database);

mysql_query("set character_set_client    ='cp1251'");
mysql_query("set character_set_results    ='cp1251'");
mysql_query("set collation_connection    ='cp1251_general_ci'"); 
Т.е. понятно что без соединения никак - но сравнивать правильнее скорость чистого запроса и инклюда,подразумевая что соединение с БД выполнено ранее(предлагаю его не учитывать из соображений того,что соединение, как правило, всё равно необходимо для формирования контента на странице).
Andkorol вне форума Ответить с цитированием
Старый 19.08.2010, 23:15   #23
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

А ещё не совсем понятно назначение вашей функции makemenuarray() - вы позиционируете её как:
Цитата:
//--------------------- Фунция считывания данных о меню ----------------------//
- фактически же в ней просто явно формируется массив Меню:
PHP код:
function makemenuarray() {
    
$menuarray = array();
    
$menuarray['Подкатегория 11'] = 'Категория 1';
    
$menuarray['Подкатегория 21'] = 'Категория 2';
    
$menuarray['Подкатегория 31'] = 'Категория 3';
    
$menuarray['Подкатегория 32'] = 'Категория 3';
    
$menuarray['Подкатегория 33'] = 'Категория 3';
    
    return 
$menuarray;

Так зачем тогда эта функция - можно просто в menu.php формировать массив Меню,затем просто подключаем файл к основному - и вуаля,Меню готово к использованию(я к тому, что в этом случае мы зря тратим время на вызов функции).

Последний раз редактировалось Andkorol; 19.08.2010 в 23:17.
Andkorol вне форума Ответить с цитированием
Старый 19.08.2010, 23:20   #24
Виталий Желтяков
Старожил
 
Аватар для Виталий Желтяков
 
Регистрация: 19.04.2010
Сообщений: 2,702
По умолчанию

Цитата:
А как планируете реализовать динамику во 2-м варианте - имею ввиду ,например, изменение количества пунктов меню(подменю),изменение названий пунктов,и вроде у ТС было подсчитано количество статей-новостей?
Руками - открыл файл в блокноте и с корректировал. Если нужен интерфейс для редактирования, то можно сделать простейший просмоторщик локальных файлов. В файл можно сохранять сразу сериализованный массив, а потом просто извлекать его. Не вижу ничего сложного.
Цитата:
как мне кажется - при трассировке первого варианта не совсем корректно учитывать вот эти моменты
Можно не учитывать, получиться 0.0014 против 0.0008. При этом, хочу отметить, с увеличением пунктов меню первая цифра будет очень быстро расти.
Цитата:
А ещё не совсем понятно назначение вашей функции makemenuarray()
Это чисто моя заморочка - можете не обращать на неё внимание. Я просто пишу большие проекты и использование отдельных функций в этом случае удобно.

Последний раз редактировалось Виталий Желтяков; 19.08.2010 в 23:22. Причина: Дополнение
Виталий Желтяков вне форума Ответить с цитированием
Старый 19.08.2010, 23:27   #25
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Цитата:
Руками - открыл файл в блокноте и с корректировал.
- т.е. добавилась статья - надо увеличивать счетчик количества статей в этом файле(да ещё и в нужном разделе),добавился раздел/подраздел - то же самое....
Как-то это всё на 90-е похоже....))))
И всё это ради разницы в 0.0006 ?
Ну не знаю прям....
Andkorol вне форума Ответить с цитированием
Старый 20.08.2010, 00:14   #26
SkyM@n
Laravel/Vue expert
Старожил Подтвердите свой е-майл
 
Аватар для SkyM@n
 
Регистрация: 08.08.2007
Сообщений: 2,832
По умолчанию

Andkorol, ваша критика ясна. А теперь все ждем от вас ваших примеров.
SkyM@n вне форума Ответить с цитированием
Старый 20.08.2010, 04:44   #27
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Я склонен использовать для создания Меню информацию из БД.
В данном случае вполне подходит вариант,предложенный mv28jam:
Цитата:
В таблице categories надо ввести поле parent, в котором будет находиться id родительской категории, если это подкатегория или false если это родительская категория. Используя такую схему, можно организовать любую глубину вложенности.
В других случаях - по обстоятельствам.

Вариант,предложенный Виталием Желтяковым даёт определенную выгоду в скорости и снижении нагрузки.
Есть только одно большое НО - ручная корректировка...

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

Цитата:
А теперь все ждем от вас ваших примеров.
Ну раз ждёте - получайте!
Пример с использованием БД - тоска зелёная,обыденность...
Займемся-ка мы посильной автоматизацией варианта Виталия Желтякова!

Итак,имеем Меню вида,примерно предложенного ТС:
-----------------------------------------------------
Новости (количество)
Статьи (количество)
Каталог (общее_количество)
Подкатегория 1 (количество)
Подкатегория 2 (количество)
.....
Подкатегория N (количество)

------------------------------------------------------

(...продолжение следует...)

Последний раз редактировалось Andkorol; 20.08.2010 в 04:48.
Andkorol вне форума Ответить с цитированием
Старый 20.08.2010, 04:47   #28
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Соответственно этому виду и работаем - пишем набор функций для создания и обслуживания данного Меню,и помещаем его,например,в menu.php:

menu.php
PHP код:
// функция извлечения массива Меню из файла
// $path_to_file - путь к файлу с Меню
function get_menu_array($path_to_file){
    
$file file_get_contents($path_to_file);
    
$menu_array unserialize($file);
    return 
$menu_array;
}

// функция записи массива Меню обратно в файл
// $path_to_file - путь к файлу с Меню
// $array - массив,который пишем
function set_menu_array($path_to_file$array){
    
$Menu_in_file serialize($array);
    
$fd fopen($path_to_file'w+');
    
fwrite($fd$Menu_in_file);
    
fclose($fd);
}

// функция создаёт базовое Меню в указанном файле
// вызываем ОДИН РАЗ )))!!!
// $path_to_file - путь к файлу с Меню
function create_menu_array($path_to_file){
    
// создаваемый массив - примерный
    
$Menu = array(
        
'news' => array('name' => 'Новости''link' => '/news.php''count' => 3),
        
'articles' => array('name' => 'Статьи''link' => '/articles.php''count' => 6),
        
'catalog' => array('name' => 'Каталог''link' => '/catalog.php''count' => 14),
        
'sub_menu' => array(
            
'sub_category_1' => array('id' => '1''name' => 'Подкатегория 1''link' => '/catalog.php?category=1''count' => 2),
            
'sub_category_2' => array('id' => '2''name' => 'Подкатегория 2''link' => '/catalog.php?category=2''count' => 4),
            
'sub_category_N' => array('id' => '3''name' => 'Подкатегория 3''link' => '/catalog.php?category=N''count' => 8)
        )
    );
    
set_menu_array($path_to_file$Menu);
}

// при добавлении новой новости или статьи
// изменяем количество статей/новостей в Меню
// $item - news или articles
// $path_to_file - путь к файлу с Меню
function menu_change_counter($item$path_to_file){
    
$Menu get_menu_array($path_to_file);
    
$Menu[$item]['count']++;
    
set_menu_array($path_to_file$Menu);
}

// при добавлении новой подкатегории в Каталог
// $id - id подкатегории в БД
// $name - название новой подкатегории
// $path_to_file - путь к файлу с Меню
function menu_add_subcategory($id$name$path_to_file){
    
$Menu get_menu_array($path_to_file);
    
$new_subcategory 'sub_category_' $id;// ключ для новой категории
    
$Menu['sub_menu'][$new_subcategory] = array(
        
'id' => $id,
        
'name' => $name,
        
'link' => '/catalog.php?category=' $id,
        
'count' => 0
    
);// формируем новый элемент массива
    
set_menu_array($path_to_file$Menu);
}

// при добавлении товара в подкатегорию Каталога
// увеличиваем счётчик в подкатегории и в Каталоге
// $id - id подкатегории в БД, в которую добавлен товар
// $path_to_file - путь к файлу с Меню
function menu_add_in_subcategory($id$path_to_file){
    
$Menu get_menu_array($path_to_file);
    
$needed_subcategory 'sub_category_' $id;// нужная нам подкатегория
    
$Menu['sub_menu'][$needed_subcategory]['count']++;// увеличили в подкатегории
    
$Menu['catalog']['count']++;// увеличили общее число в Каталоге
    
set_menu_array($path_to_file$Menu);
}

// изменение или добавление пункта Меню
// $item - пункт,который изменяем(добавляем)
// $path_to_file - путь к файлу с Меню
// $array - массив с новой информацией в формате array('name'=>'имя', 'link'=>'ссылка')
// кривенько,конечно(напр. нельзя указать очередность нового пункта) - но как пример сойдёт)))
function menu_add_change_item($item$path_to_file$array){
    
$Menu get_menu_array($path_to_file);
    if(isset(
$Menu[$item])){
        
// если такой пункт есть - меняется его содержимое,кроме счётчика
        
$Menu[$item]['name'] = $array['name'];
        
$Menu[$item]['link'] = $array['link'];
    }
    else{
        
// если такого пункта нет - он создаётся
        
$array['count'] = 0;// т.к. пункт новый
        
$Menu[$item] = $array;
    }
    
set_menu_array($path_to_file$Menu);
}

// изменение или добавление подкатегории
// $id - id подкатегории в БД
// $path_to_file - путь к файлу с Меню
// $array - массив с новой информацией в формате array('name'=>'имя', 'link'=>'ссылка')
function menu_add_change_subcategory($id$path_to_file$array){
    
$Menu get_menu_array($path_to_file);
    
$subcategory 'sub_category_' $id;
    if(isset(
$Menu['sub_menu'][$subcategory])){
        
// если такая подкатегория есть - обновляем инфу,кроме счётчика и id
        
$Menu['sub_menu'][$subcategory]['name'] = $array['name'];
        
$Menu['sub_menu'][$subcategory]['name'] = $array['link'];
    }
    else{
        
// если такой нет - создаём
        
$array['id'] = $id;
        
$array['count'] = 0;
        
$Menu['sub_menu'][$subcategory] = $array;
    }
    
set_menu_array($path_to_file$Menu);


(....продолжение следует....)
Andkorol вне форума Ответить с цитированием
Старый 20.08.2010, 04:47   #29
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

При помощи этих функций(применив их в нужных местах) мы можем:
- создать по шаблону файл с Базовым Меню - create_menu_array()
- фиксировать в Меню добавление новостей/статей - menu_change_counter()
- добавлять новые подкатегории в Меню - menu_add_subcategory()
- фиксировать добавление товаров в подкатегории Каталога - menu_add_in_subcategory()
- изменять или добавлять новые пункты в Меню - menu_add_change_item()
- изменять или добавлять подкатегории в Каталоге - menu_add_change_subcategory()

Таким образом,у нас получение массива с Меню происходит так:

index.php
PHP код:
include('menu.php');// файл с функциями Меню

$Menu get_menu_array('путь_к_файлу_с_меню');// да хоть menu.txt ))))

// собственно вывод Меню
if(!empty($Menu)){
    foreach(
$Menu as $item => $value){
        if(
$item != 'sub_menu'){
            
// подкатегории пока не выводим
            
echo '<a href="' $value['link'] . '">' $value['name'] . '</a>&nbsp;(' $value['count'] . ')<br/>';
        }
    }

Вот так - всего-то делов...
И скорость работы приличная

Что я не сделал - так это "обратные функции"(т.е. действия при удалении товара из подкатегории,статьи или новости - ну и собственно удаление самих пунктов Меню и подкатегорий Каталога) - но на основе сделанных мною функций сделать такие "обратки" не сложно.

Всё это дело может показаться громоздким и неудобным(это ж почти при каждой операции добавления-редактирования-удаления из БД надо пользовать одну из таких функций) - но на деле все эти функции будут применяться на "бэк-энде",так сказать(т.е. в Админской части) ,а там нагрузки и скорость не так критичны,как на пользовательской стороне.

Вот как-то так,мог что-то и упустить(ничё не тестил - всё на скорую руку написано,просто как пример) - ночь всё-таки...
Кто что заметит/имеет_предложить/дополнить - кричите.

Последний раз редактировалось Andkorol; 20.08.2010 в 05:00.
Andkorol вне форума Ответить с цитированием
Старый 20.08.2010, 10:05   #30
mv28jam
Старожил
 
Аватар для mv28jam
 
Регистрация: 09.09.2008
Сообщений: 2,624
По умолчанию

Раз уж тут такое началось

Виталий Желтяков ваше стремление к оптимизации очень правильное, но ваше решение с include не самое быстрое и очень неудобное. Andkorol прав в том что доверять админу или юзеру править php нельзя.
Для оптимизации работы с бд большие/высоконагруженные приложения используют как минимум Memcahe.
Я доделал ваш скрипт варианта работы с БД.\
PHP код:
$memcache= new Memcache;
$memcache->pconnect('localhost''11211');
$array=$memcache->get('key');
if(
$array===false){
    
$database mysql_connect ("localhost""","");
    
mysql_select_db("test"$database);
    
    
mysql_query("set character_set_client    ='cp1251'");
    
mysql_query("set character_set_results    ='cp1251'");
    
mysql_query("set collation_connection    ='cp1251_general_ci'");
    
    
//--------------------- Фунция извлечения данных о меню ----------------------//
    
function makemenuarray() {
        
$query "SELECT *
                        FROM `menu`"
;
        
$sql mysql_query($query);
        if (
mysql_num_rows($sql) > 0) {
            
$menuarray = array();
            
$row mysql_fetch_assoc($sql);
            do {
                
$menuarray[$row['subcategory']] = $row['category'];
            }
            while (
$row mysql_fetch_assoc($sql));
            
            return 
$menuarray;
        }
    }
    
//----------------------------------------------------------------------------//
    
    
$array makemenuarray();
    
$memcache->set('key',$array);

Время первой генерации как у вас, а вот время последующих генераций в среднем 0.0002 сек. При этом данные храняться в бд и легко редактируются без доступа админа/юзера к коду. Синхронизация базы данных и memcached идёт с помощью несложного контроллера, который чистит кеш в случае изменения таблицы с меню.
Стрелок-охотник
mv28jam вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
PHP выборка из базы данных Olga38 Помощь студентам 0 20.12.2014 14:54
Проблема организации игровой базы... dukales БД в Delphi 18 28.06.2011 13:23
Подойдет ли MySQL для организации базы данных Аватар Софт 1 18.04.2011 03:17
PHP + Базы данных. Скрипт расписания. Zalim Фриланс 3 12.01.2011 14:34
Delphi 7 выбор организации базы данных Streamline БД в Delphi 3 16.08.2010 14:39