timo-71

Рейтинг
63
Регистрация
19.09.2018

Очередной 🍿

Про ВП вижу потроллить успели:D

Ответ, что ТЗ, исполнители, аудит (внедренные решения), грамотный договор (соответствие ТЗ, внедрение, гарантии, сопровождение) существенно снизят/улучшат/повысят надои, наверное тоже было. Если нет, в предыдущих сериях аналогичных дискуссий точно можно найти.

Aisamiery:
Мы не юзаем компоненты битрикса из коробки и вам не советуем

Тогда смысл битрикса?

-----------------

nikonlay:
height: 1px;

display:block;

А если "слово-слово слово-слово слово-слово-слово-слово", то граница слова ( \b) вероятно поможет

Sitealert:
^([^-\s]+)-([^-\s]+)\s$

Если проверяется что то типа "слово-слово", последний пробельный символ мешает

Solmyr:
SELECT id, value FROM

Раньше помогало составной ключ на id, value. Ну и иннодб. Если оп есть, чтоб оно поместилось. Давно на монге, мускул стал забывать.

edogs:
МонгоДБ к гадалке не ходи достает данные из кэша так или иначе.

Там тоже через гадалку, если запаса оп нет. На 1 млн по "_id" на хдд, после systemctl restart mongod в зависимости от (ну, начнем с load average) вполне может от 1 до 5сек. На прогретом и 200 микросек м/б. Все зависит от наличия оп, ну и

wiredTiger:

engineConfig:
cacheSizeGB:
, как вариант. Если оп не хватает для каких то других процессов и индексов монги одновременно, то вполне вероятно и рандом - от сек до микросек..
miketomlin:
Смысл в том, чтобы не использовать «сначала предопределенные роуты», а перенести и их в БД,

Были попытки соскочить, но гибкости нужной не всегда получается с роутингом из бд. Вручную описанные роуты эффективней в плане приоритетов времени и места выполнения. На примере распределения ролей - документ должен быть доступен только

'role'  => ['master', 'admin']
В этом случае, если нет пользовательской куки,до инициализации ядра дело можно не доводить, а если она есть, после определения пользователя, если он "не той системы", тоже можно throw. В случае с роутингом из бд - в любом случае, как минимум лишний коннект+запрос к бд в случае, если роль не подходит. Так как только после получения параметров роута из базы мы можем понять, доступна инфа текущему юзеру или нет.

Или другой, более показательный пример

'content-type'  => 'application/json',

'allowed' => 'POST',
'nologin' => 1
Логиниться нет смысла, т/к ответ для поисковой подсказки в json и должен отдаваться любому пользователю без разницы авторизован он или нет. Плюс, метод POST и application/json предполагают проверку токена. Т.е варианты. А если учесть специфичных клиентов, типа обмен 1С, где свой механизм авторизации и никакие другие токены/куки не нужны ...

В общем, гораздо проще разрулить все это роутингом похожим на традиционный. На самом раннем этапе, чтобы лишних телодвижений не делать:)

miketomlin:
Да, это оч. вкусная плюшка

Там фантазия только нужна, например имеем урлы

/sec1/sec2/sec3

/sec1/sec2/sec4

/sec1/sec5/sec6

, в /sec1/sec2 определен другой шаблон для документа, а в /sec1 слайдер(баннер/еще там чего), с флагом наследовать. И все документы по цепочке урла имеющие их парентом, автоматически получают все это. Соответственно, если не имеют свои значения для этих параметров.

Так что, на мой взгляд, есть как плюсы. Очевидные, что бы использовать это. Но и минусы, тоже есть. Как и у любой вещи.

Sly32:
А у меня так

Вы с точки зрения программера. Попробуйте, чтобы без обращения к вам, чтобы часть категорий была доступна вместо katalog-tovarov/tablet/... по адресу samsung/tablet/..., другая tablet/cases/..., при том, что в любой момент может появится еще-какой-нибудь/tablet после обновления каталога. Или будет заведена новая категория аксессуаров, где нет брендов. Потом, если получится, посчитайте +/-

Единственно, что напрашивается, если клиента побреете, что сначала бренд и ни как иначе.

url(r'^(?P<vendor>[-\w]+)

Что само по себе, напрягает

А если, еще и статья нужна с урлом /samsung/почему-самсунг-лучше-айфона, а по урлу /samsung/полезное, листинг анонсов статей, которых 100500.

Поэтому, считаю, такого плана роутинг не лучшее решение, тут и программер скажет, ну его, анриал

----

Иными словами - изменения в базе, легко меняют любой урл, начиная с первой секции.

miketomlin:
маска одна общая, предназначенная скорее для того, чтобы просто сузить границы дозволенного (исключить кириллицу, верхний регистр, левые GET-параметры и т.п. при обработке запросов). Реальный роутинг происходит уже на основе данных из БД.

Не претендую, но. У меня вообще никакой маски нет. Правила простые. Сначала предопределенные роуты.

'routes'  => [
    'index' => [
        'controller'    => 'Cms\\Controller\\SiteIndex',

'content-type' => 'text/html',
'allowed' => 'GET',
'tpl' => [ 'type' => 'twig',
'area' => _TWIGTPL .'/default.tpl',
'template' => '/main.twig'
],
],
'search' => [ 'controller' => 'Cms\\Controller\\Search',
'content-type' => 'application/json',
'allowed' => 'GET,POST',
'nologin' => 1
],
'usr' => [ 'controller' => 'Cms\\Controller\\Usr',
'content-type' => 'text/html',
'tpl' => [ 'type' => 'twig',
'area' => _TWIGTPL .'/default.tpl',
'template' => '/usr.twig'
],
'logined' => true,
],

Казалось бы, достаточно на все случаи, если есть программер под рукой. Но, гибкости хотелось, и меньше зависеть от админов сайтов. Поэтому:

'default_route' => [
    'controller'    => 'Fwe\\Controllers\\Dflt',

'content-type' => 'text/html',
'allowed' => 'GET',
'tpl' => [ 'type' => 'twig',
'area' => _TWIGTPL .'/default.tpl',
'template' => '/page.twig'
],
],
. Ранее, часто название соответствующего класс похоже на Request - довольно жесткий контроль урла. Может быть излишне. Секция урла, не может быть отличной от

^[0-9a-z\_\-]{1,127}\.?[a-z0-9]{0,6}$
иначе исключение.

Примерно такие таблички (DВ данном случает Sqlite, но не важно)

CREATE TABLE "map" (

"_id" TEXT NOT NULL UNIQUE,
"section" TEXT,
"link" TEXT UNIQUE,
"name" TEXT NOT NULL,
"parent" TEXT DEFAULT '',
"is_view" INTEGER DEFAULT 0,
"is_hit" INTEGER DEFAULT 0,
"order" INTEGER DEFAULT 10000,
"img" TEXT DEFAULT '',
"colls" TEXT DEFAULT '',
"plug" TEXT,
"up" INTEGER DEFAULT 0,
PRIMARY KEY("_id")
)
CREATE INDEX "section_link_name" ON "map" (
"section",
"link",
"name"
)

В общем то, такой подход позволяет обработать любой динамический урл заданный админом сайта в админке. Таблица map это просто карта разделов сайта, каждый из которых может иметь набор статей и коллекций colls (категория каталога товаров или др. объект). Иными словами, по урлу /articles/my-first-article, в табличке мап будет только articles, а my-first-article попытаемся найти в другой, при условии, что articles в мап есть. Аналогично с коллекциями. Это накладывает некоторые лишние действия при изменении урла в мап, но все решаемо. Профит, главным образом в том, что админ сайта не парит мне мозг, когда ему надо какой то свой урл сделать вместо /catalog/samosvaly/kamaz-65115, а легко делает /avto/gruzovye/samosval/kamaz-65115. Ну или просто /kamaz-65115, если коллекция самосвалы приписана к морде.

miketomlin:
производительность с учетом использования БД

Не поленюсь, несколько строк на коленке накидать:

$sql = 'SELECT count("_id") FROM "map";';

prnt(Core::dbsq('site.db')->q($sql, null)->R(),1);
prnt(Core::dbsq('site.db')->rows(),1);
prnt(Core::dbsq('site.db')->q(
'SELECT * FROM "map" WHERE "section"=:section ;', [ [':section'=>'company'],
[':section'=>'faq']
])->R(),1);
prnt(Core::dbsq('site.db')->rows()); die;
И выложить результат.

Array

(
[sql] => SELECT count("_id") FROM "map";
[sqltype] => select
[sqlnum] => 3
[rows] => 1
[changes] => 0
[allrows] => 1
[eCode] => 0
[error] =>
[time] => 0.12(ms)
[affected_rows] => 0
)
Array
(
[0] => Array
(
[count("_id")] => 363
)
)
Array
(
[sql] => SELECT * FROM "map" WHERE "section"=:section ;
[sqltype] => select
[sqlnum] => 4
[rows] => 12
[changes] => 0
[allrows] => 12
[transaction] => 1
[eCode] => 0
[error] =>
[time] => 0.24(ms)
[affected_rows] => 0
)

Таких разделов сайта не будет слишком много, в данном случае 363 и за 0.24(ms) легко получить 12 разделов 1 секцией имеющих

 

[':section'=>'company'],
[':section'=>'faq']

Т.е. имеем все доступные документы /company/about, /company/contacts, /company/.... Если среди них есть, с текущим урлом, то продолжаем дальше, если нет 404. Всякие бредкрумбы уже готовы.

Aisamiery:
особенно вэб девелоперу
danforth:
Сижу на линуксах

+100. Все что надо для вэб разработки под рукой. Когда то, давно, еще в начале 0-х предавал линукс в пользу винды. В свою защиту имею сказать, тогда бледно все было - браузер конкуерор, гимп, который в куче окон открывался и т.д.. Сейчас красота. Игр нет, но я и не любитель.

Sitealert:
Отправляется ошибка 500, а не пустой ответ.
ivan-lev:
там в "пустоте" и 200 и 500 разглядеть можно..

Нгинкс+пхп-фпм 500, В других случаях, особенно, с учетом

ArbNet:
У меня есть приложение с вебсервером, своей базой данных и своим языком программирования

, не факт. Вполне может и 200;)

Всего: 541