За последние 24 часа нас посетили 63278 программистов и 1739 роботов. Сейчас ищут 856 программистов ...

Многоуровневая система...

Тема в разделе "Прочие вопросы по PHP", создана пользователем Vladson, 20 дек 2006.

  1. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Вот подумалось, а что если сделать такую структуру скрипта.

    Если index.php сделать так называемой "входной точкой" скрипта и далее делить скрипт на несколько частей (в этом примере на get и post)

    PHP:
    1. <?php
    2. include 'config.php';
    3. if ($link = mysql_connect($mysql['host'], $mysql['user'], $mysql['pass'])) {
    4.     if (mysql_select_db($mysql['base'])) {
    5.         include "common.php";
    6.         if ($_SERVER['REQUEST_METHOD']=='GET') {
    7.             include "get.php";
    8.         } elseif ($_SERVER['REQUEST_METHOD']=='POST') {
    9.             include "post.php";
    10.         } else {
    11.             header("HTTP/1.0 404 Not Found");
    12.         }
    13.     } else {
    14.         die(mysql_error());
    15.     }
    16.     mysql_close($link);
    17. } else {
    18.     die(mysql_error());
    19. }
    20. ?>
    Дело в том что в любом скрипте между GET и POST запросами нет ничего общего, стало быть и делать общего у них кроме конекта к базе практически и быть не может...

    Далее разбивать их ещё на части, например в get.php сделать мой любимый

    PHP:
    1. <?php
    2. $mode = 'default';
    3. if ( isset($_GET['mode']) ) {
    4.    if ( !empty($_GET['mode']) ) {
    5.       if ( !preg_match("#[^a-z]#s", $_GET['mode']) ) {
    6.          $mode = $_GET['mode'];
    7.       }
    8.    }
    9. }
    10. $filename = 'module_' . $mode . '.php';
    11. if ( file_exists($filename) ) {
    12.    include $filename;
    13. } else {
    14.    header("HTTP/1.0 404 Not Found");
    15. }
    16. ?>
    Далее можно вообще разбить его хоть на тысячи мизерных файлов чтоб не загружалась ни одна строчка кода которая не имеет исключительно важного значения

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

    Как это будет смотреться со стороны ?
    Велосипед или ....... ?
     
  2. 440Hz

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

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    я веду разработку на уровне директориев с псевдонаследованием.
    тож ничё

    а уж работу с базой давно вынес ядро.
     
  3. Anonymous

    Anonymous Guest

    Vladson, походу, читает мои мысли ;)
    На get и post я делить как то не догадался, но проблема та же в голове крутиться — минимизировать обьем исполняемого кода... даже не проблема, а так — смутное желание...
    В принципе, у пеня примерно так и делается -
    у меня:
    PHP:
    1. <?
    2. include('logic/'.$mode.'.php');
    3. $tpl->parse('MODULE_OUTPUT',$mode);
    4. ?>
     
  4. AlexGousev

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

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    А зачем все делать в одном файле?
    Для пост-запросов создаем отдельный и все.
    Для вывода: если используется шаблонизатор, то один index.php, который смотрит на параметры GET (указанные явно, или mod_rewrite'ом сделанные) и парсит соответствующий шаблон.
    Если нет шаблонизатора, то я обычно делаю несколько файлов. Причем они, как правило, по структуре один-в-один совпадают с файлами шаблонов.

    Складывать все функции в func.php - тоже не дело: лучше создать что-то типа common.php, db.php, bla-bla-bla.php, ...

    Абсолютно то же самое у меня с .css. Есть common.css, index.css, contacts.css и т.д. Но это, в основном, ради удобства: большой .css неудобно редактировать и приходится давать длинные имена и сложные правила (эх, была бы в IE нормальная поддержка наследования в CSS - жить было бы проще ;)).
     
  5. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Так все и делают, и я тоже, но тут я предлогаю пойти ещё дальше... (вообще до уровня полной паранои)

    Именно что не дело, однако большенство делают именно так (хотя все понимают что так не надо делать)
     
  6. vb

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

    С нами с:
    6 июн 2006
    Сообщения:
    911
    Симпатии:
    0
    Адрес:
    Saint-Petersburg
    У меня достаточно часто бывают и пост и гет запросы - например гет из .htaccess (mod_rewrite) пост из страницы, а бывает то и другое из страницы.

    Поэтому считаю что идея неверна в корне, либо я ее не понял.

    Раньше обычно делал один файл, например index.php на который перенаправлял все запросы к несуществующим файлам или к типам файлов которые должны обрабатываться скриптом.

    Практика показала - геморно. Поддержка отнимает у людей много времени, в том числе и у автора - то есть у меня самого.
    Как мне кажется пришел к оптимальному на данный момент решению (собственно так и начинал когда то давно программировать на пхп):
    Определяем количество типов отображения страниц и создаем на них по файлу.
    Например на маленьком сайте - для этого достаточно одного файла.
    Для больших 6-30 - зависит от того насколько сложный сайт.

    Далее в каждом файле описываем поведение скрипта в этих файлах. ну собственно и все.

    Те же самые запросы отправляем на index.php, там делаем подключение constructor.inc, файл должен содержать минимальный необходимый набор подключений и действий чтобы скрипт мог функционировать (например подключение БД, чтение системных конфигов).

    Далее определяем какая страница запрошена.
    И делаем соответствующий инклуд. То есть подключаем один из наших 6-30 файлов.
    подключаем destructor.inc и все.

    Ну и все, там уже пожалуйста прописываем все что душе угодно, но не стоит перегнуть с объемом - рекомендуемый объем до 100 строк.

    ИМХО такой вариант прост в поддержке и не нужно искать какое событие случилось, чтобы определить какой файл открывать для правки - достаточно знать область события.

    Кроме того каждый файл открывает тот набор файлов классов и функций который небходим для его работы, то есть системе не нужно держать в уме все инклуды.

    А мельчить область по типу запроса, на мой взгляд не есть правильная идея.
     
  7. DarkElf

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

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    Vladson

    главное, чтобы не получилось так, как у автора одной статейки по шаблонам в Perl..

    "Все началось с того, что хотел подправить текст сообщений ... жестко введенный в коде ...

    // описание методов шаблонизации и т.п.

    В итоге страница стаба собиратся из 28 файлов.."
     
  8. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    (эта часть была вынесена в отдельную тему однако касается этой по этому повторю)
    Не понял, я имею в виду не использование разными файлами POST и GET переменных, а разруливание разными модулями скрипта POST и GET "HTTP-запросов"

    А вообще топик про разбитие на логически завершённые блоки в которых есть одна точка входа и несколько точек выхода для придания коду структуру "дороги с множеством развилок", вместо того чтоб делать структуру "паука" у которого есть ядро и куча точек входа и выхода (как это сделано например в рнрВВ) а GET и POST это лишь примеры

    DarkElf
    Полностью с тобой согласен, цель должна оправдывать средства, и это касается ВСЕГО ЧТО ЕСТЬ В ЭТОМ МИРЕ (и программирования в частности) писать движки сайта на ассемблере или писать драйвера видиокарт на JavaScript это не самый лучший выход :)
     
  9. vb

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

    С нами с:
    6 июн 2006
    Сообщения:
    911
    Симпатии:
    0
    Адрес:
    Saint-Petersburg
    Наконец я нашел время на написание ответа. Итак,

    Хорошо, пусть есть массив $_POST и $_GET и есть модуль (пусть это будут объекты) $POST и $GET.

    Предположим, что вопреки коду первого сообщения $POST и $GET могут выполняться одновременно (иначе однозначно косяк).
    Но если у нас $POST и $GET содержат в себе логику при этом являются точками входа, получается, что при одновременном вызове нужно заботиться о том, чтобы логические цепочки не прерывались до того как оба модуля отработают. А так как у нас вся логика заключена в эти модули и логика одного модуля, если я правильно понял, не зависит от другого, получается что это достаточно проблематично. Например - использование редиректа. Или в пхп часто встречаются любители exit()


    Предположим, что
    Источник
    Перечень источников

    Слово "прикладные" отбросим и получаем, что согласно указанной выше цитате логика снова не правильная.
    Лично я всегда стараюсь придерживаться этого правила, о котором рассказывают еще на первом курсе института.
     
  10. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Мы всё равно как будто на разных языках говорим...

    Какие нахрен объекты точки входа и прочая фигня, ты понимаешь что такое URL ? Вот я и предлогаю в зависимости от URL делать те действия для которых он предназначен...

    Поясню в тысячный раз !!!
    У меня нас есть гостевуха с урлами вида
    index.php?mode=viewpage&num=1, index.php?mode=viewpage&num=2 и.т.д.
    На странице есть пост форма index.php?mode=addpost
    Всё что я предлогаю это во время обращения к viewpage и addpost с помощью условий и include()
    ГРУЗИТЬ ТОЛЬКО ТЕ КУСКИ КОДА КОТОРЫЕ НУЖНЫ ДЛЯ ЕГО ВЫПОЛНЕНИЯ И НЕ БАЙТОМ БОЛЬШЕ !!! ВСЁ НИЧЕГО ДРУГОГО !!!
     
  11. vb

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

    С нами с:
    6 июн 2006
    Сообщения:
    911
    Симпатии:
    0
    Адрес:
    Saint-Petersburg
    Я вроде на все ответил по цитатам. У тебя снова какой-то не адекват включился.

    Если мыслить рамками только гостевых мог написать все проще без заявок на какую-либо многоуровневую систему. Уже неоднократно замечаю, что у тебя все сводится к гостевым.
     
  12. Anonymous

    Anonymous Guest

    Ага. Хлопцы, вы только не подеритесь... ;)