За последние 24 часа нас посетили 23009 программистов и 1257 роботов. Сейчас ищут 716 программистов ...

Авторам движков на PHP

Тема в разделе "Прочие вопросы по PHP", создана пользователем Dagdamor, 24 мар 2007.

  1. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    dark-demon
    Не согласен :(
    Такой подход не соответствует 99% (грубо говоря) всех CMS, выложенных в общедоступное пользование на настоящий момент - почти все они являются готовыми сайтами, а не "универсальными заготовками", и используют их соответственно - просто ставят и пользуются, ничего или почти ничего не меняя. Даже дизайн зачастую оставляют как есть, только шапку переделывают и все. Существуют, конечно, исключения, когда систему перед использованием нужно серьезно дорабатывать под себя, и без этого никак, но почти все они предпочитают называть себя CMF.

    Имхо:
    1. CMS = готовая к употреблению система управления содержанием сайта, кулинарной обработки не требует, поставить может любой желающий;
    2. CMF = "движок" = не сайт, а только костяк будущего сайта (в предельном случае - вообще голый набор библиотек), поставить может только программист с руками;
    3. CMF + заточка под конкретный функционал + удобная админка для манипулирования данными = CMS.
     
  2. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    1. ядро, минимальный код, необходимый для работы 2.
    2. framework, cmf, движок - набор библиотек, модулей и т.д.
    3. cms, сайт
    3.1. минимальный код, необходимый для инициализации 1
    1.2. индивидуальные особенности сайта/cms
     
  3. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    специально подчеркну: работающий комплекс, который надо ещё конфигурировать под конкретную задачу, менять дизайн, подключать модули и тп.

    если изменят хотябы список разделов - уже другой сайт :)

    ну в общем, мы друг друга поняли :-D
     
  4. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Такс, если помните, я обещал выложить свой вариант, вот выкладываю.
    Сразу оговорюсь, что это не код, который будет работать out of box, это пример конкретный, вырезка из конкретного реального проэкта (часть модулей которые я выложил я обрезал по причине сами понимаете какой, не обрезаны только forums и forums_topis, рабочего форума там нету, не хватает ещё одного самого большого модуля :p). Так что смотрите, оценивайте, кто захочет - можете взять саму основу, подогнать под себя и юзать.

    собственно качать здесь: http://file.lv/framework.rar (71,6 KB)
    Весь код в UTF-8 (without signature). Так же в папке есть фаил Zend Project'a - у меня фаилы лежали в C:\framework\
     
  5. ZZZubec

    ZZZubec Активный пользователь

    С нами с:
    28 мар 2007
    Сообщения:
    140
    Симпатии:
    0
    Очень ждал, ща гляну...
     
  6. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    http://www.boomtime.lv/ :)
     
  7. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    - код читается хорошо. это радует.
    - почему работа с базой идет напрямую, а не через класс, хотя код объектно ориентированный?
     
  8. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    440Hz
    А зачем нагружать код ещё какими-то классами по работе с БД?
    1). Оно замедляет работу
    2). У нас почти нету простых запросов, поэтому писать их всёравно руками надо. К тому же посмотрите код - методы в основном только и делают, что выбираю данные с базы данных и передают данные шаблонам. Всё чётко, ясно и понятно. В данном случае абстракция только усугубит всё. Ну лично я бы заюзал бы MySQLi в объектном синтаксисе, но я не с самого начала работаю в фирме, поэтому пишу так, как писали уже до меня.
    3). У нас только одна БД, других не планируеться.

    Ti
    Да да, ты прав. Так что при желании можете попробовать зарегаться (если в Латвии есть знакомые) и посмотреть в действии :)
     
  9. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    а нахрена все вообще тут делается?
    =)

    и насколько? микросекунды? не на том экономим...

    тебе, но мне вот не очень.
     
  10. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    440Hz
    Я же написал, так было до меня. Так что как есть так есть. В своих проэктах уже юзаю MySQLi и объектный синтаксис :)

    Ну чужой код конечно ещё надо понять, что бы оценить его возможности и недостатки.
     
  11. mclaud

    mclaud Активный пользователь

    С нами с:
    15 фев 2007
    Сообщения:
    97
    Симпатии:
    0
    Адрес:
    Одесса
    Я разработал CMS, подсказать могу, кодом делиться НЕ БУДУ
     
  12. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    mclaud
    Вы хотите об этом поговорить?
     
  13. mclaud

    mclaud Активный пользователь

    С нами с:
    15 фев 2007
    Сообщения:
    97
    Симпатии:
    0
    Адрес:
    Одесса
    Ti
    А у Вас есть Sprite?
     
  14. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    mclaud
    Нет, у меня отличная черная шляпа!
     
  15. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    жадина. уйдем мы от тебя...
     
  16. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    После моего поста как-то все утихли... Изучают что-ли? :D
    Когда можно ждать вердикт? :D

    mclaud
    А зря, тебе бы за бесплатно указали слабые стороны, дали бы советов что можно улучшить или сделать более эффективно :)
     
  17. Vah

    Vah Активный пользователь

    С нами с:
    15 май 2006
    Сообщения:
    228
    Симпатии:
    0
    Psih
    ну если так экономить время хочешь - попробуй переписать на простых запросах...... а класс...... ну микросекунды....... хотя если планируется только с мускулем работать и никакой универсализации - то тут класс не принципиален......

    упростив вот это до пары простых запросов:
    SELECT IFNULL((fra_access + 0), 2) AS fra_access, fra_for_id, for_id, for_title,
    (for_level + 0) AS for_level, (for_hidden + 0) AS for_hidden, (for_new_topic_level + 0) AS for_new_topic_level
    FROM forums
    LEFT JOIN forums_areas ON for_far_id = far_id
    LEFT JOIN forums_access ON fra_prf_id = '.(int)$session['auth'].'
    WHERE for_id = '.(int)$id, $database);

    думаю больше времени сэкономить можно......
     
  18. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Vah
    В данном случае это довольно простой запрос, который практически базу не нагружает. Хуже будет если это будет 3 запроса. Не только нагрузит саму базу, но ещё и PHP ьудет заметно медленее тормозить.

    Надо же всё-же рационально смотреть на оптимизацию. Можно не писать класс-прослойку для базы данных, потому что оно практически ничего не поменяет (а его отсутствие позволит немного съэкономить на ресурсах) в отличии от того, что писать вместо одного запроса - 3-4, каждый отдельно связать и слинковать данные с приведущими, что бы получить один целостный масив данных, который отправить на вывод.

    Вообщем, ИМХО, глупость вы сказали.
     
  19. xak2

    xak2 Guest

    Psih
    Не подскажеш какой СМС сервер ты используеш?
     
  20. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    xak2
    Мы работаем напрямую с операторами, без посредников.
     
  21. Aleksforum

    Aleksforum Активный пользователь

    С нами с:
    4 май 2007
    Сообщения:
    8
    Симпатии:
    0
    Предлагаю обсудить мою СУСку.
    Для примера дам код движка и код модуля по генерации страницы.

    Движок:
    PHP:
    1.  
    2. <?
    3.  
    4. $global_module = array();//глобальная переменная доступных модулей
    5. $global_active_module = array();//глобальная переменная модулей используемых в шаблоне
    6. $global_idsheet = 0;//ИД активной страницы
    7. $global_options_result = 0;//загруженные настройки сайта из базы в формате mysql
    8. $global_message = array();//передача сообщений между модулями и подача системных сообщений
    9.  
    10. require "config.php";//загрузка конфигурации
    11.  
    12. //require "func_link.php";
    13.  
    14. load_options();
    15. load_modules();
    16. engine_sheet();
    17.  
    18. function load_options()//загрузка настроек
    19. {
    20. $db = dbconnect();
    21. $sql = "SELECT * FROM ".$GLOBALS["_prefix"]."options";
    22. $GLOBALS['global_options_result'] = mysql_query($sql,$db);
    23. mysql_data_seek($GLOBALS['global_options_result'], 0);
    24. while($row = mysql_fetch_array($GLOBALS['global_options_result']))
    25.     {
    26.     if($row['name'] == "send_email") $GLOBALS['send_email'];
    27.     }
    28. }
    29.  
    30. function load_modules()//загрузка модулей из папки /modules
    31. {
    32. if ($handle = opendir('modules'))
    33.       {
    34.       while(false !== ($file = readdir($handle)))
    35.             {
    36.         if ($file != "." && $file != ".." && preg_match("/(.*)\.php|inc$/",$file)) {
    37.             require("modules/".$file);
    38.                   }
    39.             }
    40.       closedir($handle);
    41.       }
    42. }
    43.  
    44. function engine_sheet() //генерирует страницу
    45. {
    46. global $PHP_SELF, $REQUEST_URI;
    47.  
    48. //echo $REQUEST_URI."<br>";
    49.  
    50. if(empty($_GET['page']))//есть ли ссылка на страницу по ИД
    51.       {
    52.       preg_match("/\/([0-9a-zA-Z.]*)[\/]?/",$REQUEST_URI,$res);//вырезает из урла название страницы
    53. //      echo $res[1]."<br>";
    54.       if(empty($res[1])) //если нет названия страницы, то запуск главной страницы
    55.             {
    56.             $sql="SELECT id, design FROM ".$GLOBALS["_prefix"]."sheet WHERE url='index.htm'";
    57. //            echo $sql."<br>";
    58.             }
    59.       else//запуск страницы по названию в ссылке
    60.             {
    61.             $sql="SELECT id, design FROM ".$GLOBALS["_prefix"]."sheet WHERE url='".$res[1]."'";
    62. //            echo $sql."<br>";
    63.             }
    64.       }
    65. else//если есть page значит запустить страницу через ИД
    66.       {
    67.       if(ctype_digit($_GET['page']) && strlen($_GET['page']) < 10){//проверка переменной page на правельность
    68.     $sql="SELECT id, design FROM ".$GLOBALS["_prefix"]."sheet WHERE id='".$_GET['page']."'";
    69.     /*echo $sql."<br>";*/}
    70.     else echo "неправельный параметр";
    71.       }
    72.  
    73. $db = dbconnect();
    74.  
    75. $sheetrow = mysql_fetch_array(mysql_query($sql));
    76. $GLOBALS['global_idsheet'] = $sheetrow['id'];
    77. //echo "id: ".$sheetrow['id']."<br>";
    78.  
    79. $sql = "SELECT id, template FROM ".$GLOBALS["_prefix"]."design WHERE id='".$sheetrow['design']."'";
    80. $result  =mysql_query($sql);
    81. $templ = mysql_fetch_array($result);
    82. $templ['template'] = stripslashes($templ['template']);
    83.  
    84.  
    85. //Подготовка списка якорей шаблона
    86. preg_match_all("/\<\!--\s(.*)\s--\>/",$templ['template'],$anchor_list);
    87. $GLOBALS['global_active_module'] = $anchor_list[1];
    88. //echo implode(",", $anchor_list[1])."<br>";
    89.  
    90. //запуск загруженных модулей и вставка их в шаблон
    91. reset($GLOBALS['global_module']);
    92. foreach($GLOBALS['global_module'] as $value)
    93.       {
    94.       if($value->checket()) $templ['template'] = $value->toPage($templ['template']);
    95.       }
    96.  
    97. //просмотр и обработка системных сообщений
    98. reset($GLOBALS['global_message']);
    99. foreach($GLOBALS['global_message'] as $value)
    100.       {
    101.       if($value[0] == "ref_win_adr")//комманда перезагрузки страницы на указанный адрес
    102.         {
    103.         echo "<script language=javascript>self.location.replace('".$value[1]."');</script>";
    104.         return;
    105.         }
    106.       if($value[0] == "go_home")
    107.         {
    108.         echo $value[1];
    109.         return;
    110.         }
    111.       }
    112.  
    113. echo $templ['template'];
    114. }
    115.  
    Модуль:
    PHP:
    1.  
    2. <?php
    3. //вставка дополнительных элементов в страницу
    4. class mod_sheet
    5. {
    6.       var $name_module = array("titlecode", "headercode", "stylesheet", "textsheet");
    7.       var $anchor = array("<!-- titlecode -->", "<!-- headercode -->", "<!-- stylesheet -->", "<!-- textsheet -->");
    8.       var $data = "";
    9.  
    10.       function mod_sheet()
    11.             {
    12.             }
    13.  
    14.       function checket()
    15.             {
    16.             foreach($GLOBALS['global_active_module'] as $value)
    17.                   {
    18.                   foreach($this->name_module as $value2)
    19.                         {if($value == $value2) return true;}
    20.                   }
    21.             return false;
    22.             }
    23.  
    24.       function toPage($template)
    25.             {
    26.             $db = dbconnect();
    27.             $sql="SELECT * FROM ".$GLOBALS["_prefix"]."sheet WHERE id='".$GLOBALS['global_idsheet']."'";
    28.             $sheetrow  =mysql_fetch_array(mysql_query($sql));
    29.             mysql_close($db);
    30. //          echo "title: ".$sheetrow['title']."<br>";
    31.             if(!empty($sheetrow['metakeywords'])) $datahead.="<meta name=\"keywords\" content=\"".$sheetrow['metakeywords']."\">\n";
    32.             if(!empty($sheetrow['metadescription'])) $datahead.="<meta name=\"description\" content=\"".$sheetrow['metadescription']."\">\n";
    33.             $template = str_replace($this->anchor[0], $sheetrow['title'], $template);
    34.             $template = str_replace($this->anchor[1], $datahead, $template);
    35.             $template = str_replace($this->anchor[2], "<link href=\"css.css\" rel=\"stylesheet\" type=\"text/css\">", $template);
    36.             $template = str_replace($this->anchor[3], stripslashes($sheetrow['data']), $template);
    37. //          echo $template;
    38.             return $template;
    39.             }
    40. }
    41.  
    42. array_push($GLOBALS['global_module'], new mod_sheet());//инициализация модуля и запись его в список глобальных модулей
    43. ?>
    44.  
    Хотелось бы ваши советы по поводу создания движка на объектах хотя бы абстрактно?
     
  22. stas_t

    stas_t Активный пользователь

    С нами с:
    24 апр 2007
    Сообщения:
    500
    Симпатии:
    0
    Адрес:
    Courbevoie, France
    Psih
    начал чтение и не смог не высказаться ;-)

    includes/shared.inc

    1/ для определения параметров вызова лучше бы использовать explode, а не split

    2/ с конструкцией for($i=0; $i++ < 7;) надо бы быть поосторожнее. здесь в цикле $i никогда не будет иметь значения 0. операцию вы не выиграли (что после тела цикла, что до него, $i всё равно увеличивается), а wtf фактор усилили. в качестве побочного эффекта -- отсутствие обработки $request[0]...

    3/ а можно было настроить конфигурацию мускула так, чтобы обойтись без двух вызовов set charset и set names при каждом коннекте?

    4/
    Код (Text):
    1. /* Если на сервер зашли через IP - Перебросить на www */
    2. if ($_SERVER['SERVER_NAME'] == $_SERVER["SERVER_ADDR"]){
    3.     header('Location: http://www.boomtime.lv');
    4.     die();
    5. }
    ... можно было бы переместить в начало файла (до соединения с базой)

    5/ разборки с $server_name и $server_domain, возможно, упростятся, если их разруливать на уровне апача и устанавливать не в этом файле, а в index.php, который для каждого домена будет свой. скорее всего у вас конечное число вариантов [jenya-dev]-[friends]. во всяком случае однозначно должно исчезнуть пугающее условие count($server_name) > 2 && $server_name != '' :)

    дальше начинается что-то очень интимное. понравился код
    Код (Text):
    1. $db_lng = '_'.$session['language'];
    2. $time = time();
    3. $domain = 'friends';
    4. switch($session['language']){
    5.     case 'ru':
    6.         header('Content-language: ru');
    7.         $db_lng = '_ru';
    8.  
    9.         /* Locale */
    10.         putenv("LANG=ru_RU");
    11.         setlocale (LC_MESSAGES, "Russian");
    12.         bindtextdomain ($domain, "locale");
    13.         textdomain($domain);
    14.         bind_textdomain_codeset($domain, 'UTF-8');
    15.         break;
    16.  
    17.     case 'en':
    18.         header('Content-language: en');
    19.         $db_lng = '_en';
    20.  
    21.         /* Locale */
    22.         putenv("LANG=en_EN");
    23.         setlocale(LC_MESSAGES, "en_US");
    24.         bindtextdomain ($domain, "locale");
    25.         textdomain ($domain);
    26.         bind_textdomain_codeset($domain, 'UTF-8');
    27.         break;
    28.  
    29.     case 'lv':
    30.         header('Content-language: lv');
    31.         $db_lng = '_lv';
    32.  
    33.         /* Locale */
    34.         putenv("LANG=lv_LV");
    35.         setlocale (LC_MESSAGES, "lv_LV");
    36.         bindtextdomain ($domain, "locale");
    37.         textdomain ($domain);
    38.         bind_textdomain_codeset($domain, 'UTF-8');
    39. }
    давайте вместе заценим использование $db_lng и $domain.

    в подробности работы с шаблонами я не вдавался, но уверен, что там всё в порядке.

    Dagdamor
    я тут уже высказывался в какой-то теме довольно неприлично по поводу шаблонов времени выполнения и их влияния на ресурсы сервера. по адресу http://osbtools.googlepages.com/ находится моя система работы с шаблонами. свободное скачивание и использование. открытый исходный код. но абсолютно другой подход.
     
  23. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    stas_t

    1) Делал не я, так что кому что нравиться. Впринципе что split, что explode - одно и тоже помоему.
    2) $i++ - это пост-инкремент. Сперва сработает сравнение, потом $i будет инкрементирован. Опять же, писал этот кусок не я, так что в плане непонятности согласен.
    3) Говорят это не всегда помогает и бывают глюки. Сам не проверял. Так что думаю стоит проверить.
    4) Не все юзают Apache ;)
    5) На самом деле там веьма сложная ботаника конкретно для нашего случая. У нас у каждого свой dev хост с собственным префиксом (arvid-dev-(www|friends|groups|...).boomtime.lv) и без префикса dev (live сервер) и есть просто dev сервер без префиксов перед словом dev. Вообщем для остальных оно впринципе особо не нужно - просто упростить для каждого так, как нужно, я не модифицировал код :)

    Про интимное - это gettext :)

    $db_lng - оно потом используеться в запросах, т.к. все поля, которые имеют переводы прмо в базе называються field_ru, field_en, field_lv , соотвественно в запросе просто пишем 'SELECT field'.$db_lng.' AS field...'. Каждому своё.

    Я сразу писал, что это не готовый работать из коробки код и его надо подгонять ещё немного :)
     
  24. stas_t

    stas_t Активный пользователь

    С нами с:
    24 апр 2007
    Сообщения:
    500
    Симпатии:
    0
    Адрес:
    Courbevoie, France
    Psih

    1/ split для разбиения строки использует регулярное выражение, причём ereg-вариацию (posix), то есть очень медленную. explode делит по строке, без активирования механизма регулярных выражений. что и требуется.

    2/ собственно, неразумно с моей стороны было бы спорить с тем, что $i++ -- это пост-инкремент :) я обратил внимание на нестандартное использование for, где этот пост-инкремент стоит не на отведённом для него месте, а прямо в условии, провоцируя побочный эффект. подобный стиль опасен при групповой разработке.

    3/ я бы проверил :)

    4/ апач тут не при чём. просто логичнее код, который проверяет параметр и прерывает скрипт поместить до того, как мы соединились с базой данных, ибо соединение пройдёт вхолостую.

    5/ вместо:
    Код (Text):
    1. $server_name = explode('.', $_SERVER['SERVER_NAME']);
    2. if (count($server_name) > 1){
    3.     $server_domain = $server_name[count($server_name)-2].'.'.$server_name[count($server_name)-1];
    4. }else{
    5.     $server_domain = $_SERVER['SERVER_NAME'];
    6. }
    7.  
    8. /* Имя домена - после 2ой точки с конца */
    9.  
    10. $server_name = count($server_name) > 2 && $server_name != '' ? $server_name[count($server_name)-3] : 'www';
    можно попробовать вот это:
    Код (Text):
    1. list ($server_name, $server_domain) = explode ('.', $_SERVER['SERVER_NAME'], 2);
    про интим/
    использование gettext само по себе в разряд интима не попадает. однако в приведённом куске кода следующие довольно повеселившие моменты:
    - $db_lng сначала инициируется некоторым значением, а потом внутри switch получает то же самое значение.
    - $domain вообще непонятно что делает внутри switch, ибо bindtextdomain, textdomain и bind_textdomain_codeset могут спокойно быть вынесены за его пределы.

    я вот тут подумал, а что скажут люди, которые писали этот код, когда узнают, что он здесь выложен в открытом доступе и мы об него здесь вот так ноги вытираем ;-)
     
  25. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    stas_t
    Ничего не подумают, основу никто не прячет и коллега знает что я его сюда выкладывал :) Т.к. я его основательно подготовил перед выкладкой, ничё криминального в этом нету :)

    1). Ок
    2). well, we work 5 programmers here, no questions were asked. Собственно впринципе то поменяю :)
    3). :)
    4). Ага, надо пнуть будет коллегу на работе по этому поводу :)
    5). А если ввести просто boomtime.lv ? Будет глюк :)

    про интим - да эт уже мелкие придирки.
    И, между прочим, всё корректно отработает, если вдруг получиться так, что ни один CASE не отработает :)