ФорумПрограммированиеPHP для идиотов → Оптимизация роутера запросов

Оптимизация роутера запросов

  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 20 января 2010 г. 2:08, спустя 55 секунд

    я придумал ахуенное дополнительное наследование настроек в dudecms lite … аухеть там конфиг гибкий, потом когда нить опишу. система почти никому не покзана, она больше предоставляет теоретический характер, хотя и работает на helldude.ru :)
    Сапожник без сапог
  • md5

    Сообщения: 11949 Репутация: N Группа: в ухо

    Spritz 20 января 2010 г. 3:11, спустя 1 час 2 минуты 27 секунд


    я придумал ахуенное дополнительное наследование настроек в dudecms lite … аухеть там конфиг гибкий, потом когда нить опишу. система почти никому не покзана, она больше предоставляет теоретический характер, хотя и работает на helldude.ru :)
    ооо
    так вот почему там нихуя не работает и почти все страницы в 500 ошибку вылетают))))
    все умрут, а я изумруд
  • artoodetoo

    Сообщения: 5139 Репутация: N Группа: в ухо

    Spritz 20 января 2010 г. 3:32, спустя 21 минуту 32 секунды

    adw0rd, в той старой теме мы с дудом обсуждали всякие варианты. здесь я решил (пока) не усложнять, а захардкодить типа
    "page" — это понятно число, => (\d+)
    "…id" тоже. => (\d+)
    а остальное какбы любой набор символов, => (.+)
    наверное добавлю "…date" => (\d{4}-\d{2}-\d{2}) или просто ([\d\-]+)

    url('/post/(\d{2,4})/', 'post')

    а чем нехороши post/8 или post/3908 ??? они в эту маску не укладываются
    "id" => (\d+)

    я считаю роутер не должен слишком много знать про то как его результаты будут дальше использоваться. контроль значений это не его задача.
    так, самый минимум — какие использовать символы
    ιιlllιlllι унц-унц
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 20 января 2010 г. 3:51, спустя 18 минут 57 секунд

    url('/post/(\d{2,4})/', 'post')


    а чем нехороши post/8 или post/3908 ??? они в эту маску не укладываются
    "id" => (\d+)
    это просто пример, можешь вместо {2,4} воткнуть *
    Спустя 81 сек.
    я считаю роутер не должен слишком много знать про то как его результаты будут дальше использоваться. контроль значений это не его задача.
    так, самый минимум — какие использовать символы

    А мне нравиться разруливать в роутере…
    adw/0
  • Абырвалг

    Сообщения: 6476 Репутация: N Группа: Джедаи

    Spritz 20 января 2010 г. 4:11, спустя 19 минут 21 секунду

    Эту тему хотел создать я!!!!111
    ну ниче страшного) Главное, что обсудим это. Я думаю о повторном парсинге и append распарсенных параметров
  • Абырвалг

    Сообщения: 6476 Репутация: N Группа: Джедаи

    Spritz 20 января 2010 г. 4:28, спустя 17 минут 23 секунды

    сейчас у меня так выглядит кусок правил роутинга для форума в группах:

    // чтение темы, страница
    'groups/:num/forum/:num/:num.:num' => array('m' => 'groups.forum_reader_topic', 'params' => array('groupId', 'boardId', 'topicId', 'page')),
    // чтение темы
    'groups/:num/forum/:num/:num' => array('m' => 'groups.forum_reader_topic', 'params' => array('groupId', 'boardId', 'topicId')),
    // создание новой темы
    'groups/:num/forum/:num/add' => array('m' => 'groups.forum_topicManager', 'params' => array('groupId', 'boardId')),


    как планирую сделать:

    'groups/:num' => array('m' => 'groups', params => array('groupId'), 'subparser' => 'groups');

    поняли, что это группа, делаем субпарсинг для группы

    'forum' => array('m' => 'forum', 'subparser' => 'forum');
    'gallery' => array('m' => 'gallery', 'subparser' => 'gallery');

    ага, это форум, идем в модуль форума и парсим его роутер

    // чтение темы, страница
    ':num/:num.:num' => array('m' => 'reader_topic', 'params' => array('boardId', 'topicId', 'page')),
    // чтение темы
    ':num/:num' => array('m' => 'reader_topic', 'params' => array('boardId', 'topicId')),
    // создание новой темы
    ':num/add' => array('m' => 'topicManager', 'params' => array('boardId')),


    m приобретает вид groups_forum_reader_topic или как-то так
  • artoodetoo

    Сообщения: 5139 Репутация: N Группа: в ухо

    Spritz 21 января 2010 г. 23:12, спустя 1 день 18 часов 43 минуты

    Абыр, кажется я понимаю о чем ты, я даже могу кое-что предложить, но сцуко мы щаз настолько уйдем от главной темы, что пиздец.
    Спустя 64 сек.
    Я тут пытаюсь донести до масс реально ценную мысль, между прочим :)
    Спустя 67 сек.
    Можно, пока не поздно, я еще раз намекну на соль этой темы? Есть список допустимых в системе маршрутов. Предположим их 100.
    Если каждый URL равновероятен, то при тупом переборе среднее количество сравнений с шаблонами маршрутов стремится к 50.
    50 регекспов на один запрос это както оскорбительно для порядочного программиста


    Я предлагаю выделить ту часть шаблона, что не содержит параметров, для предварительной проверки без регулярок. Ещё я предложил (но не сделал хе-хе, уже сделал): использовать отсортированный массив маршрутов для того, чтобы применить быстрый поиск без регулярок. Например известный поиск делением пополам. Среднее количество сравнений должно упасть до ln(N), то есть потенциально не более 5 6 сравнений на 100 вариантов.
    ιιlllιlllι унц-унц
  • Абырвалг

    Сообщения: 6476 Репутация: N Группа: Джедаи

    Spritz 20 января 2010 г. 5:05, спустя 5 часов 53 минуты 21 секунду

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


    ну смотри мой кусок кода, который толком еще не реализован:


    protected function _parse()
    {
    // набор методов-парсеров
    $parsers = array(
    'common', // обрезаем слеши по бокам, все, что справа от "?", index.php (если есть)
    'static', // статический роутинг. Ты про это?
    'semiDynamic',
    'database'
    );

    $e404 = true;
    foreach ($parsers as $parser) {
    if (call_user_func_array(array($this, 'parse_' . $parser), array())) {
    $e404 = false;
    break;
    }
    }
    //print_r($this->data);
    $_GET = array_merge($_GET, $this->data);
    if (!defined('POSSIBLE_404'))
    define('POSSIBLE_404', $e404);
    }

    public static function parse($url = NULL, array $router = array())
    {
    if (self::$parsed && !($router && $url)) {
    // мы типа уже парсили основной УРЛ
    return true;
    }

    $instance = new self;
    // парсим общие правила или это ПОДПАРСИНГ?
    $instance->router = $router ? $router : include 'config/routers_semiDynamic.php';
    $instance->_parse($url);
    self::$parsed = true;
    }


    return array(
    'files' => array('m' => 'files.lister'),
    'files/add' => array('m' => 'files.manager'),
    'files/my' => array(
    'm' => 'files.lister',
    'do' => 'search',
    'type' => 'my'
    ),
    // ——————–
    'forum' => array('m' => 'forum.reader_forum'),
    // ——————–
    'blogs' => array('m' => 'blogs.lister'),
    'blogs/write' => array('m' => 'blogs.writer'),
    // ——————–
    'registration' => array('m' => 'account.registration'),
    'login' => array('m' => 'account.login'),
    'logout' => array('m' => 'account.logout'),
    'password' => array('m' => 'account.password'),
    // ——————–
    'groups' => array('m' => 'groups.lister'),
    // ——————–
    'peoples' => array('m' => 'peoples.lister'),
    // ——————–
    'profile' => array('m' => 'profile.main'),
    // ——————–
    'messages' => array('m' => 'privateMessages'),
    );


    делаю key_exists($url, массив). Если существует - прекращаю парсинг. Это статический роутер
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 20 января 2010 г. 5:09, спустя 3 минуты 39 секунд



    я придумал ахуенное дополнительное наследование настроек в dudecms lite … аухеть там конфиг гибкий, потом когда нить опишу. система почти никому не покзана, она больше предоставляет теоретический характер, хотя и работает на helldude.ru :)
    ооо
    так вот почему там нихуя не работает и почти все страницы в 500 ошибку вылетают))))
    это я шаблон ошибок не поправил, там должна быть 404 =))

    а работает там все вроде как, просто много ссылок на несуществующие страницы
    Сапожник без сапог
  • artoodetoo

    Сообщения: 5139 Репутация: N Группа: в ухо

    Spritz 20 января 2010 г. 5:11, спустя 2 минуты 22 секунды

    Абырвалг, честно — ничего не понял. давай ты сделаешь рабочий пример  и мы его погоняем.
    ιιlllιlllι унц-унц
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 20 января 2010 г. 5:14, спустя 2 минуты 35 секунд

    $instance->router = $router ? $router : include 'config/routers_semiDynamic.php';
    вот такое я почему то пиздец ненавижу, мозг переворачивает … использовать пхп файл - как функцию какт неправильно чтоли, да я знаю что так можно, но просто както не по себе …
    Сапожник без сапог
  • Абырвалг

    Сообщения: 6476 Репутация: N Группа: Джедаи

    Spritz 20 января 2010 г. 5:18, спустя 4 минуты 11 секунд

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


    Мы сначала приводим URL к чистому виду
    было
    /index.php/login/?name=konstantin&pass=112211
    обрезали все, что справа от "?"
    /index.php/login/
    отрезали index.php
    /login/
    отрезали слеши по бокам
    login

    пробуем найти в массиве статических роутеров ключ 'login'
    нашли
    'login' => array('m' => 'account.login')
    URL распарсен, роутер завершил свою работу. Никаких регулярок.
  • artoodetoo

    Сообщения: 5139 Репутация: N Группа: в ухо

    Spritz 20 января 2010 г. 5:28, спустя 10 минут 13 секунд

    а давай без GET-параметров. например как ты реализуешь правило
    'topic.view.p' => 'topics/{$tid}/page-{$page}.html',

    имею topics/12/page-2.html
    хочу получить 'topic.view.p', 'tid'=>12, 'page'=>2
    как это будет выполнено?
    ιιlllιlllι унц-унц
  • Абырвалг

    Сообщения: 6476 Репутация: N Группа: Джедаи

    Spritz 20 января 2010 г. 5:33, спустя 5 минут 2 секунды

    это с регулярками. Реализую так: http://pyha.ru/forum/topic/3904.msg80905#msg80905

    topics/:num/page-:num.html => array('m' => 'topic.view.p', 'params' => array('tid', 'page'))

    можно кешировать. Url на входе соответствует таким-то параметрам на выходе. Но я не уверен в эффективности этого.
  • Ewg777

    Сообщения: 510 Репутация: N Группа: Джедаи

    Spritz 20 января 2010 г. 5:35, спустя 2 минуты

    Абырвалг, аналог Zend_Controller_Router_Route получился.

Пожалуйста, авторизуйтесь, чтобы написать комментарий!