еще чего :lol: может мне его скачать, потестить и вынести свой вердикт? В остальном согласен. хотя знаешь ли мне проще шаблоны как файлы хранить - редактировать и искать удобнее... про быстродействие как-то еще не задумывался... Стоит ли переносить именно гипертекст (ну может еще и CSS) в базу? Какой выигрышь это дает?
Ganzal Смотря как этот CSS файл используется в системе - если он вставляется прямо в текст страницы - тогда да, стоит, а если на него в тексте страницы просто стоит <link rel=...> ссылка, и браузер запрашивает его как обычный файл - тогда конечно нет. Твой CSS, как и остальные шаблоны, становится динамическим - это позволяет пользоваться такими приемами: Код (Text): td { font-size:[currentFontSize]px; } .header { background-image:url([imagesPath]/header.gif); }
Тут я разместил код движка и код модуля: http://www.php.ru/forum/viewtopic.php?t=4821&start=60 Шаблоны у меня простейшие по типу: код штмл <!- news --> код штмл <!- menu --> По поводу вашего удивления о том что я его храню в базе. Я тоже так же удивляюсь когда вижу, что кто то хранит данные в файлах и не могу понять зачем так делают? Для меня база - это всё связанное с данными из которых собираются страницы и только код сборки страниц у меня лежит не в базе. Картинки частично лежат в папке имг, другие в базе. В базе обычно я храню все картинки связанные с объектами каталогов или интернет магазинов, которые загружаются пользователем СУС. Картинки же дизайна сайта и\или шаблона хранятся в файлах. Но мы ушли очень далеко от темы. Думаю тут просто разные подходы размещения данных. Меня очень сильно волнует как можно сделать СУС на объектах и хранить эти объекты в базе (думаю что хранить в файле это будет почти так же). К примеру у нас есть объект страница главная сайта. На главной странице размещены объекты новости, меню и текст вступительный сайта. Есть страница Контакты, где размещено меню и текст контактов. В моём движке я функцией загружаю из базы шаблон страницы в которой есть вставки-якоря новостей и меню с текстом. Далее запускаю все модули которые отвечают за функции меню, текста и новостей и они отдают в переменную код сгенерированный из которого я по шаблону собираю страницу и выдаю в браузер. Но всё это псевдо ООП и мне бы хотелось увидеть совет или пример как можно сделать на объектах мои модули и генератор хотя бы абстрактно без реализации.
шаблоны - это и есть "код сборки". и не надо путать шаблоны вывода данных с самими данными. субд разрабатывались не для того, чтобы хранить данные (с этим просто замечательно справляется файловая система), а для того, чтобы делать разнообразные выборки данных используя специальные алгоритмы. шаблоны и картинки не надо "выбирать" - их нужно только хранить, читать и очень редко записывать - это работа для ФС.
dark-demon Не хотелось бы на тупой флуд отвечать тупым флудом, скажу только то что поводу картинок я с вами более чем согласен, но переделывать код вывода, загрузки и обработки картинок мне некогда и не горит. И замечу, что тут я вроде невидел рангов за кол-во набитых постов и смысла флудить невижу.
разрабатывать код надо было изначально с расчётом на то, что данные могут храниться не только в одной единственной БД, а также и в другой, в файлах, в памяти, на клиентской машине.
Aleksforum вы хотите сказать, что все эти действия производятся каждый раз при загрузке каждой страницы вашего сайта? ничего не понимаю. вероятно, упустил что-то. давайте так. вот я решил использовать ваш движок для создания и поддержки своего сайта. у меня на сайте страница с новостями. новости мы обновили неделю назад. с тех пор эта страница была загружена пол-лимона раз. вы же не хотите сказать, что простое отображение этой страницы потребовало пол-миллиона соединений с базой данных и нескольких миллионов sql-запросов? если это так, то вам на ближайшее время, похоже, нет резона заниматься объектной проблематикой, а стоит пересмотреть саму концепцию работы вашего движка. нет никакого смысла запрашивать в базе данных статическую информацию для создания одной и той же страницы, которая должна храниться в кеше файловой системы и при запросе которой апач просто должен отдавать готовый файл. запускать php апач должен только для страниц, содержащих логику приложения, то есть динамически меняющихся при каждом запросе. и уж в любом случае не для отрисовки статического интерфейса. в противном случае ваш движок будет просто бесстыдно транжирить процессорное время моего сервера и время ожидания моих клиентов. не так давно (лет этак с десяток тому назад) была написана тогда ещё крохотная программка, позволявшая из одного шаблона и множества файлов с содержимым создавать полноценные страницы сайта, вставляя каждый файл с содержимым в шаблон и помещая его в целевую папку в виде нормальной страницы. собранный таким образом сайт, вне зависимости от количества страниц, отличало единство интерфейса и независимость от движка. то есть статический сайт из двухсот страниц не требовал ни наличия базы данных, ни даже запуска php для его отображения. при изменении какого-либо файла с содержимым только этот файл обрабатывался (вставлялся в шаблон) и обновлялся в целевой папке. при изменении шаблона обновлялись все страницы сайта. с тех пор многое в ней изменилось, сегодня эта система позволяет обрабатывать несколько шаблонов, имеет развитую систему макро-команд, собственный ftp загрузчик, позволяющий выгружать на сайт только страницы, изменённые в целевой папке, а также автоматически создавать sitemap-файл, требующийся для нормальной индексации вашего сайта. программа написана на php и распространяется свободно (gpl) через sourceforge.net. я говорю про open site builder tools, что на http://osbtools.googlepages.com/. сайт, правда, на аглицком, но я как разработчик могу прояснить все детали её работы на чистом русском.
Вы верно подметили, что страницы полностью генерируются каждый раз при запросе. И там поболее запросов к базе чем 2 на страницу. Если вы уш стали говорить о хостинге, то у моего хостера много серверов и сервер с базой данных стоит отдельно и он не один. Думаю что хостеру выгоднее балансировать нагрузку на разных серверах вместо того чтоб загружать файловую систему одного сервера. Далее подмечу вам, что мой хостер загрузку сервера меряет в % и ему глубоко по чижику сколько миллионов раз её запросили, главное чтоб я не вышел за лимит нагрузки на сервер. А нагрузка всех наших проектов на сервер провайдера стремится к 0-ю ))) Да и выдача страниц клиену довольно хороша, единственное как сказал dark-demon сильно затормаживает вывод каталогов с картинками(они из базы берутся), но для клиента это почти незаметно и сидеть с секундомером никто не будет. Кэшировать динамики - это конечно хорошо и я думал над этой проблемой, но для этого нужно модернизировать проект так чтоб его можно было легко переделывать кусками и разным людям и как раз для этого я и хотел перейти на полноценную модель ООП. Очень рад, что вы мне указали мои ошибки, но именно эти я давно знаю и попытаюсь исправить.
Хоть сообщение stas_t и выдержано в стиле рекламного плаката, но оно верно и взвешенно, и то что он предлагает в качестве решения - очень неплохо продумано!, а ваш ход мысли Aleksforum и соответственно отношение к ресурсам, хостеру, пользователям, коду, да и к психике разработчиков (которым как вы расчитываете будет нужно "переделывать кусками и разным людям") - просто мерзкое. Каких вы тут реальных предложений ждете? - не ясно. Вам уже предложили реальное - в мусор...
Вообще, против хранения шаблонов в ДБ, у меня есть одно противопоказание. Столкнулся у своего хостера с тем, что у него стоит ограничение 20'000 запросов за час. Если переборщить с количеством запросов, то можно их и вычерпать.
В мусор конечное хорошее предложение, но оно примерно такое же когда вы придете к врачу зуб вылечить, а он вам говорит зуб выдернуть и лечить его ненужно т.к. зуб у вас полное г... Поэтому такого типа предложения я рассматриваю, как бесполезная болтовня человека не разбирающегося в Веб - строительстве. Как я писал я хочу увидеть мысли, идеи, советы или примеры модели объектного движка. Сам же я выложил код движка по ссылке выше и думаю новички могут, что то почерпнуть из этого кода. А очень надеюсь, что ктонить знающий подкинет и мне идеи, не о том что всё хранить надо в файлах, а более интересные идеи. virabhadra 20 000 запросов в час к базе очень даже хорошо, строить сайт для гигантов ИКЕА или ещё кого я пока не готов))) Самый посещаемый у меня проект был на 100 человек в день и это примерно 5000 запросов в день. dark-demon я думал о сериализации, а как же делать поиск по сайту, если и заголовок и текст и другие объекты поиска будут сериализованы? А допустим, у меня есть каталог товаров и у каждого товара есть позиция и эту позицию хочу изменить. Мне придётся все объекты сериализовывать у каталога, что узнать какие у них позиции? А потом всё обратно запихивать. Все вот говорят файлы-файлы, а если у меня непросто движок который собирает пару файлов инклудами вместе по шаблону, а что то более глобальное. Например интернет-магазин. У которого куча страниц и каталог товаров и ведение учёта покупок и панель управления и новости вы что мне советуете превратить папку(в которой лежит сайт) в кучу мусора в котором даже супер-мен ноги поломает? Было бы интересно услышать о хоть одной более менее нормальной СистемеУправленияСайтами, которая не использует базу для хранения. А то может stas_t замутил себе страничку домашнюю, собрав её из кучи нарезаных файлов и теперь думает, что и другим надо так делать ? )))
Даза Банных? Хех. Если вы считаете что 20 шаблонов - это куча мусора, в которой , тогда незнаю даже что тут и посоветовать можно... Ах вот - посмотрите как устроена шаблонная система в движке phpBB. Возможно вас это натолкнет на какие-либо измышления...
Ну мы тут не обсуждаем, кто чем конкретно занимается, а занимаемся теоретическими основами практики Может здесь на форуме и сидит, кто-то кто делает страницу для ИКЕИ. Сказал я об этом как о возможном ограничении в каком-то случае.
Dagdamor Smarty тормозной не потому что он на фаилах (фаилы куда быстрее чем база данных в данном случае, к тому-же это огромное кол-во запросов на базу данных - более-менее посещаемый сайт быстро исчерпает ресурсы сервера), а потому что он слишком большой и навороченный (что почти нафиг не нужно). К тому-же Smarty это практически это скриптинговый язык ещё более высокого уровня чем PHP. Нормальный шаблонизатор (смотрите топик "Авторам движков на PHP", я выложил там свой движок) работает быстро и без проблем. К тому же если вы используете кеширование PHP кода (XCache, APC, Zend Encoder...) то код кешируется в оперативной памяти в виде байткода, так что быстрее уже просто некуда Aleksforum Если тебе нужен именно движок (не CMS), то посмотри вот это сообщение http://php.ru/forum/viewtopic.php?p=45997#45997. Движок очень хорошо продуман и написан людьми, у которых опыт в разработке WEB приложений уже более 10 лет (коллега с PHP работает с самого рождения PHP) - каких-либо отрицательный отзывов я не слышал - так, мелкие придирки больше из разряда "ну мне больше нравиться работать с классом базы данных чем с фкнкциями mysql_*, что легко внедряеться при необходимости). Там есть уже все основные необходимые составляющие: движок, структура папок, шаблоны и.т.д. А если тебе нужен уже какой-нить готовый интернет-магазин, то ищи скрипты и юзай (и удачи разбираться в этом кошмаре Мне лично проще самому смвоё написать). Для этого и есть база данных и SQL. Шаблоны надо хранить в фаилах - это факт. Это куда удобнее и работает много быстрее. Не забывайте, что любая мало-мальски нормальная фаиловая система кеширует фаилы, к которым чаще всего обращаются (XFS к примеру - суперская FS). Так что весь этот бредовый спор на тему "Шаблоны: Фаилы vs База данных" являеться чистым флеймом от незнания или лени изучить проблему. В данном случае ответ однозначен, фаилы лучше. Dagdamor Я не говорю что твоя CMF плоха, просто что-то более-менее посещаемое на этой системе не сделаешь - база данных загнёться от нагрузки, а покупать супер пупер мега навороченный многопроцессорный сервер для сайта (на который хватит самого простого сервера при правильном подходе к построению такого сайта) с небольшой, но достаточной посещаемостью, никто не будет.
Psih Хорошо, тогда продолжим аналогию: если БД такая тормозная, пользоваться ей вообще нельзя. Чем те же новости хуже шаблонов? В файлы их, и каталог товаров, и текстовые данные для галерей, и прочее. Почему люди так не делают? Да потому, что работать с данными проще, используя БД... с шаблонами та же история: манипулировать с ними удобнее, храня их в БД. Другое дело, что шаблоны обычно загоняются в систему, где бы они там ни хранились, и потом используются только на чтение. И перечитай тему еще раз - я уже писал, в каких случаях обоснован выбор в пользу БД, в каких - в пользу файлов. Я не говорил что БД "однозначно лучше", и насчет FS тоже не следует делать таких безапелляционных выводов. Попробуй ручками очистить побитый кеш Смарти на сервере, к которому у тебя нет шелл-доступа, сразу поймешь чем БД удобнее Откуда такая уверенность? P.S. Смарти такой тормозной совсем не потому, что он навороченный. Никакой он не навороченный... просто в нем отсутствует понятие сборки. Каждый шаблон транслируется в отдельный PHP файл, вместо того, чтобы группу связанных шаблонов собирать в один исполняемый файл. Поэтому при каждом вызове страницы PHP вынужден читать кучу файлов снова и снова. Типичный случай, когда люди решили, что файлы "однозначно лучше", но не продумали архитектуру такого решения, в результате получили тормоза почище БД.
Dagdamor Я смотрел ваш парсер и он мне понравился. Обязательно использую ваши наработки у себя в СУС. Может я неправильно выражался, но у меня уже есть довольно нормальная СУС (CMS), которую я хочу улучшить. И я вообще не вступал в спор по поводу где хранить шаблоны, а только сказал что у меня они хранятся в БД и пока что меня это устраивает. Davil Выше я писал свою точку зрения о файловой системе. Говорить очередной раз одно и тоже по-моему бессмысленно. Господа ну неужели нет ничего более интересного в Веб- программировании чем где хранить шаблоны? Допустим я начал планировать объектную модель на пхп и делаю класс страницы: PHP: class _sheet { //переменные страницы var $id = 0; var $name = ""; var $title = ""; var $metakeywords = ""; var $metadescription = ""; var $design = 0; var $data = ""; var $url = ""; var $access = ""; } Это простая страница без новостей и других блоков. Я хочу присобачить новости к странице и класс с новостями: PHP: class sheet_new extends _sheet { var $new = ""; } И пишу функцию загрузки свойств из базы: PHP: function load_sheet(&$res) { $this->id = $res['id']; $this->name = $res['name']; $this->title = $res['title']; $this->metakeywords = $res['metakeywords']; $this->metadescription = $res['metadescription']; $this->design = $res['design']; $this->data = $res['data']; $this->url = $res['url']; $this->access = $res['access']; return true; } Но как подключить те же новости, загрузить их и сохранить?
для поиска лучше организовать специальную индексную таблицу. какие ещё позиции? если имеется ввиду сортировка данных, то заводи отдельное поле и по нему сортируй. а вообще, это было из разряда вредных советов не просёк, в чём сложность? конкретно у меня есть понятие "генератор данных" - это скрипт, который лежит на диске и который берёт данные от туда откуда ему удобнее. в частности он может вместо запроса к СУБД и его последующей обработки, просто выдать данные из файлового кэша. транслитерированный акроним от database эксперименты показали, что тормоза тут не из-за работы с файлами, а из-за php-интерпретатора. проверял банально: в цикле инклудил один скрипт, а потом заменял инклуд на eval - ничего не менялось. у тебя есть шаблон страницы в котором есть поля, например, $header, $footer, $leftside, $rightside, $content. для каждого из них задай объект, который будет генерировать соответствующие данные. и них есть свои поля в которые нужно подставить другие объекты. и так каскадно по ниспадающей.
На общественный суд и критику Просьба тыкнуть носом если что не так сам класс шаблона (templates.php) PHP: <?php class template{ public $_dir_tpl = ''; public $_dir_tpl_compile = ''; public $_tplvar=array(); private $_conf=array(); function readconf($file){ if (is_file($file)) require_once($file); else die('template->readconf: Не найден файл конфигурации - <b>'.$file.'</b> (видимо что то случилось)'); $this->_conf=$conf; } function vars_add($vars){ reset($vars); foreach ($vars as $key=>$value) $this->_tplvar[$key]=$value; } function var_add($varname, $varvalue){ $this->_tplvar[$varname]=$varvalue; } private function compile($file, $time){ $file_tpl=(is_file($this->_dir_tpl.$file)) ? $this->_dir_tpl.$file : die('Template->compile: файл не найден - <b>'.$this->_dir_tpl.$file.'</b> (видимо что то случилось)'); $file_tpl_compile=$this->_dir_tpl_compile.$file.'.html'; if (((int)$time>0)){ if (!is_dir($this->_dir_tpl_compile)) die('Template->compile: не найдена папка - <b>'.$this->_dir_tpl_compile.'</b> (видимо что то случилось)'); if (is_file($file_tpl_compile) && filectime($file_tpl_compile)>strtotime('-'.(int)$time.' minute')){ $str = $this->loadfile($file_tpl_compile); } else { $str = $this->makefile($file_tpl, $file_tpl_compile); } } else { $str = $this->loadfile($file_tpl); $str = $this->var_preg_replace($str); } return $str; } private function var_preg_replace($str){ $str = preg_replace('#\{([a-z0-9\-_]*?)\}#ise', '$this->var_replace($1)', $str); $str = preg_replace('#\{\#([a-z0-9\-_]*?)\#\}#ise', '$this->var_conf_replace($1)', $str); return $str; } private function var_replace($match){ return isset($this->_tplvar[$match]) ? $this->_tplvar[$match] : '{'.$match.'}'; } private function var_conf_replace($match){ return isset($this->_conf[$match]) ? $this->_conf[$match] : '{#'.$match.'#}'; } function display($file, $time=0){ echo $this->compile($file, $time); } function fetch($file, $time=0){ return $this->compile($file, $time); } private function loadfile($file){ $str = file($file); if (is_array($str)){ return join('' , $str); } else { die('Template->loadfile(): видимо что то случилось'); } unset($str); } private function makefile($file_from, $file_to){ $str = $this->loadfile($file_from); $str = $this->var_preg_replace($str); $fd = @fopen($file_to, 'w') or die('Template->makefile: Не могу создать файл '.$file_to.' (видимо что то случилось)'); fwrite($fd, $str); fclose($fd); return $str; } } ?> это включаем в каждый файл (template.php) PHP: <?php require_once('templates.php'); $template = new template(); $template->_dir_tpl=''; // полный путь до папки с шаблонами $template->_dir_tpl_compile=''; // полный путь до папки для скомпиленых файлов $template->readconf(''); // полный путь до файла конфига ?> ну, типа индекс (index.php) PHP: <?php require_once('template.php'); $template->var_add('TEXT', 'Какой то текст'); $template->vars_add(array( 'TITLE'=>'Какой то заголовок', 'NAME'=>'по моему чьето имя' )); //---------------------------------- // выводить можно так $template->display('1.tpl', 1); // вторым параметром можно указать время кеширования в минутах //или так--------------------------- //$str=$template->fetch('1.tpl'); // вторым параметром можно указать время кеширования в минутах //echo $str; //---------------------------------- ?> конфигурационный файл (config.php) PHP: <?php $conf['preved']='Превед'; ?> файл шаблона (1.tpl) HTML: <table border="1"> <tr><td>{NAME}</td></tr> <tr><td>{непонятно}</td></tr> <tr><td>{TITLE}</td></tr> <tr><td>{TEXT}</td></tr> <tr><td>{#preved#}</td></tr> <tr><td>{#ne_preved#}</td></tr> </table>
вот так??? тогда мо моему можно и вообще в приват PHP: <? protected $_dir_tpl = ''; function set_dir_tpl($path){ $this->_dir_tpl=$path; } ?> PHP: <? $template->set_dir_tpl('путь тута'); ?>