Форум → Программирование → PHP для идиотов → Оптимизация роутера запросов
Оптимизация роутера запросов
Страницы: ← Предыдущая страница • Следующая страница →
-
20 января 2010 г. 13:08, спустя 55 секунд
я придумал ахуенное дополнительное наследование настроек в dudecms lite … аухеть там конфиг гибкий, потом когда нить опишу. система почти никому не покзана, она больше предоставляет теоретический характер, хотя и работает на helldude.ru :)Сапожник без сапог -
20 января 2010 г. 14:11, спустя 1 час 2 минуты 27 секунд
ооо
я придумал ахуенное дополнительное наследование настроек в dudecms lite … аухеть там конфиг гибкий, потом когда нить опишу. система почти никому не покзана, она больше предоставляет теоретический характер, хотя и работает на helldude.ru :)
так вот почему там нихуя не работает и почти все страницы в 500 ошибку вылетают))))все умрут, а я изумруд -
20 января 2010 г. 14: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ι унц-унц -
20 января 2010 г. 14:51, спустя 18 минут 57 секунд
url('/post/(\d{2,4})/', 'post')
а чем нехороши post/8 или post/3908 ??? они в эту маску не укладываются
"id" => (\d+)Спустя 81 сек.я считаю роутер не должен слишком много знать про то как его результаты будут дальше использоваться. контроль значений это не его задача.
так, самый минимум — какие использовать символы
А мне нравиться разруливать в роутере…https://smappi.org/ - платформа по созданию API на все случаи жизни -
20 января 2010 г. 15:11, спустя 19 минут 21 секунду
Эту тему хотел создать я!!!!111
ну ниче страшного) Главное, что обсудим это. Я думаю о повторном парсинге и append распарсенных параметров -
20 января 2010 г. 15: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 или как-то так -
22 января 2010 г. 10:12, спустя 1 день 18 часов 43 минуты
Абыр, кажется я понимаю о чем ты, я даже могу кое-что предложить, но сцуко мы щаз настолько уйдем от главной темы, что пиздец.Спустя 64 сек.Я тут пытаюсь донести до масс реально ценную мысль, между прочим :)Спустя 67 сек.Можно, пока не поздно, я еще раз намекну на соль этой темы? Есть список допустимых в системе маршрутов. Предположим их 100.
Если каждый URL равновероятен, то при тупом переборе среднее количество сравнений с шаблонами маршрутов стремится к 50.50 регекспов на один запрос это както оскорбительно для порядочного программиста
Я предлагаю выделить ту часть шаблона, что не содержит параметров, для предварительной проверки без регулярок. Ещё я предложил (но не сделалхе-хе, уже сделал): использовать отсортированный массив маршрутов для того, чтобы применить быстрый поиск без регулярок. Например известный поиск делением пополам. Среднее количество сравнений должно упасть до ln(N), то есть потенциально не более56 сравнений на 100 вариантов.ιιlllιlllι унц-унц -
20 января 2010 г. 16: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, массив). Если существует - прекращаю парсинг. Это статический роутер -
20 января 2010 г. 16:09, спустя 3 минуты 39 секунд
это я шаблон ошибок не поправил, там должна быть 404 =))
ооо
я придумал ахуенное дополнительное наследование настроек в dudecms lite … аухеть там конфиг гибкий, потом когда нить опишу. система почти никому не покзана, она больше предоставляет теоретический характер, хотя и работает на helldude.ru :)
так вот почему там нихуя не работает и почти все страницы в 500 ошибку вылетают))))
а работает там все вроде как, просто много ссылок на несуществующие страницыСапожник без сапог -
20 января 2010 г. 16:11, спустя 2 минуты 22 секунды
Абырвалг, честно — ничего не понял. давай ты сделаешь рабочий пример и мы его погоняем.ιιlllιlllι унц-унц -
20 января 2010 г. 16:14, спустя 2 минуты 35 секунд
$instance->router = $router ? $router : include 'config/routers_semiDynamic.php';
вот такое я почему то пиздец ненавижу, мозг переворачивает … использовать пхп файл - как функцию какт неправильно чтоли, да я знаю что так можно, но просто както не по себе …Сапожник без сапог -
20 января 2010 г. 16: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 распарсен, роутер завершил свою работу. Никаких регулярок. -
20 января 2010 г. 16: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ι унц-унц -
20 января 2010 г. 16: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 на входе соответствует таким-то параметрам на выходе. Но я не уверен в эффективности этого. -
Страницы: ← Предыдущая страница • Следующая страница →
Пожалуйста, авторизуйтесь, чтобы написать комментарий!