And I realized that Bitrix - MMR is for about Piggy sites: D 🍿
Keep. Here the "master", with the full sweep, and the fact that smoothed out the smoking room in the "glory"
Стоит посмотреть в сторону управления сайтом на основе апи.
Видюху (без слов) набросал для иллюстрации. Резкими движениями мышки акцентировал наиболее важные, с моей точки зрения, моменты.
В темах про ВП странная ситуация - несколько человек на этом форуме, в разделе "веб строительство" иногда говорят: "Мир не заперт в рамках ВП, много всего есть". И оно активно развивается. Казалось бы - юзай. Но, нет.
Для примера
--------------
Тут есть человек, который за python пропагандирует. Его троллят часто. Но, отличный инструмент.
код на коленке
результат в браузере
Тест ab -n 3000 -c 100 Нормализация (-стоп слова) сообщения на недорогом железе.
Requests per second: 241.22 [#/sec] (mean)
Любому это доступно. Легко
['почему_ADVB', 'прикрываться_VERB', 'тема_NOUN', 'отвечать_VERB', 'конкретно_ADVB', 'понимать_VERB', 'согласиться_VERB', 'деньга_NOUN', 'задача_NOUN', 'зачем_ADVB', 'прикрываться_VERB', 'wp_Non', 'отдельный_ADJF', 'web_Non', 'разработка_NOUN', 'про_PREP', 'wp_Non', 'нечего_NPRO', 'отсутствие_NOUN', 'архитектура_NOUN', 'отсутствие_NOUN', 'вменяемый_ADJF', 'ядро_NOUN', 'удобный_ADJF', 'инструмент_NOUN', 'разработчик_NOUN', 'отсутствие_NOUN', 'тест_NOUN', 'боль_NOUN', 'разработчик_NOUN', 'крайний_ADJF', 'мера_NOUN', 'боль_NOUN', 'домохозяйка_NOUN', 'пусть_CONJ', 'участвовать_VERB', 'wp_Non', 'хороший_ADJF', 'блоговый_ADJF', 'платформа_NOUN', 'контентный_ADJF', 'сайт_NOUN', 'человек_NOUN', 'далёкий_ADJF', 'разработка_NOUN', 'должный_ADJS', 'признать_INFN', 'домохозяйка_NOUN', 'продвинуть_PRTF', 'уровень_NOUN']
Сомневаюсь, все 400к каждые 4 часа изменяются.
И в 1-й раз не обязательно все 400к грузить. Зачем на новой доске столько?
Но, даже если так - задача решаемая.
Эксперимент (железо впс 1гиг, 1ядро) чтобы не быть голословным
16 сек на обновление данных по
Groups:40; Goods:11620; Personal:3; Time/Mem:15434.2420(ms)/mb16----
40 категориям, 11620 товарам, 3 менеджерам. (нестандартный 1с обмен)
400000/10000 = 40 раз по 16 секунд. ~ 11 минут.
По картинкам:
11 files saved, Prepared: 11; tm:9994.9050(ms)----
11 за менее чем 10 сек. Что делается с картинками за это время:
Сначала достаются из filename=import_files.zip
'thumbs' => [ 'xs' => '200x150', /* thumbs xsmall - phones (<768px)) */ 'sm' => '300x200', /* thumbs small - tablet (≥768px, <992px) */ 'md' => '400x300', /* thumbs medium - desctop (≥992px, <1200px) */ 'lg' => '600x450', /* thumbs large - large-desctop (≥1200px,) */ 'web' => '800x533' /* */ ],
5 тумбов + оптимизация оригинала и всех производных
switch( $this->type ) { case 'jpeg': case 'jpg': $cmd = 'jpegoptim ' . escapeshellarg($this->src) .' --strip-all --all-progressive -m 76'; break; case 'png': $cmd = 'pngquant --strip --quality=65-85 --ext .png --force 256 ' . escapeshellarg($this->src); break; }
(Гугла доволен)
Какие картинки в эксперименте
немаленькие, в среднем более 1мб (42 на 49,9Миб)
Что в итоге:
С картинками, да сложнее:
Если 1 в секунду, то если 6 млн / 86400 = ~ 70 суток. Но, тут жесткие условия эксперимента (1гиг, 1ядро). А железо сейчас недорогое..
Но и тут, если оставить 1 превьюшку, то
----progress 11 files saved, Prepared: 11; tm:3382.8290(ms)----
Я в тему только зайти пытаюсь. Присматриваюсь.
Картинко из загрузки:
Тем не менее, мало где хороший поиск.
Сложнее для каждой категории определить удобный набор параметров по которым фильтровать. А то чаще
по цене фильтруют. Что даст пользователю сортировка, в результате которой "Защитная маска для лица" будет выше "Газгольдер под ключ в Москве" для меня неясно.
3 млн в сутки? Откуда столько🍿
Ну и, да - вы только дополняете ответ на свой же вопрос
Выше говорили - поиск, рубрики, фильтры. Добавлю гео.
Простой пример, когда пользователю сложно будет найти что то.
Если, не очень большая база, то вполне годно использовать фулл-текст индекс, который есть наверное у всех субд. Я пользуюсь Скулайт и Монго. И там и там хороший прогресс за последние годы. К примеру FTS5 sqlite существенный шаг вперед относительно FTS3.
Монга: 5 мс на поиск фразы "бурильный кран камаз 43118" в тестовой коллекции из 45624 объектов. 2,5 определить кол-во найденных и примерно столько же, чтобы получить записи отсортированные по релевантности, в количестве limit с подсветкой найденных слов.
Но, уже на 500000, скорость существенно уменьшается. Правда, на слабом железе. ES
Рискну предположить, что то типа cпецификатора. Ну типа %d у sprintf(). Поэтому и int.
FrancisDarroze, посмотрите код public static function query() в классе DB и разберитесь с правилом формирования запроса.
Да вроде, ссылки публикуются. Видимо и вопрос в том, что как?
У кого то в мессаге
<span class="question-description"><a href="http://xxxxx.xxxxx" title="http://xxxxx.xxxxx" rel="external">http://xxxxx.xxxxx</a> Buy ***!</span>
А у другого
<p class="bookmark-description"><h2> How to Determine
Но, в заголовке вполне валидная ссылка:
<p class="entry-content"> </p><h3> <a href="https://xxxx.xxx" class="bookmark-title" rel="external">Persian Dates</a> </h3>
Похожую тактику юзаю, c той лишь разницей, что ид - хеш от урла. Почему то не нравится ИД в урлах:(
Здесь, в отличии от рандомного (uuid -v 4) или основанного на времени (v1) все же приходится, для сборки обвеса документа использовать (урл админ может изменить и соотв. урл_ид) ид генерируемый базой или второй uid. Что накладывает, в случае автоинкрементного, ограничение на использование REPLACE/INSERT OR REPLACE, но я и так не юзаю эти команды.
Ну, или, при изменении урла/урл_ид менять все урл_ид в связанных хранилищах, что несколько муторно
[uri] => Array ( [uri_id] => 5c668ed8 [uri] => /ru/product/nike-boost-1911 [sids] => Array ( [f1364608] => /ru [581bb2eb] => /ru/product [5c668ed8] => /ru/product/nike-boost-1911 ) [_sids] => Array ( [/ru] => f1364608 [/ru/product] => 581bb2eb [/ru/product/nike-boost-1911] => 5c668ed8 ) [sections] => Array ( [0] => ru [1] => product [2] => nike-boost-1911 ) [first] => ru [second] => product [params] => Array ( [0] => product [1] => nike-boost-1911 ) [prm_pair] => Array ( [ru] => product [product] => nike-boost-1911 ) [@] => 1b3e4648-6099-4e60-8258-6f5ca13e95b9 #🍻 [full_uri] => /ru/product/nike-boost-1911@1b3e4648-6099-4e60-8258-6f5ca13e95b9 )
В моем случае достаточно простой хеш.
// в данном случае, где то раньше define('_HASHALGO', 'crc32b'); return hash(_HASHALGO, $str);
Над переходом к чему то типа
$ uuid -v 5 $NAMESPACE "/ru/product/nike-boost-1911" df5bedc5-e212-5f62-9ee3-3dea998fcd63
уже не первый раз задумываюсь.
Зы: Идею с хранением дополнительного параметра в урле спикрал :)
Во втором product_id не примари. Ну или еще и локаль видимо должна фигурировать.
2 товара в одном из 1с зашли en, es, ru. Во втором только ru
Array ( [14818] => Array ( [_id] => 14818 [analogi] => Array [primenyaemost] => Array [soputstvuyuschietovary] => Array [relevitems] => Array [artikul] => [gruppy] => [id] => [kartinka] => Array [naimenovanie] => [naimenovanienaanglijskom] => [naimenovanienaispanskom] => [opisanie] => [price] => Array [up] => [ups] => 1 [ves] => [znacheniyarekvizitov] => Array [words] => [trigramms] => [seo] => Array [ishit] => [isview] => [actionPrice] => Array [vendor] => Array [delivery] => Array [storage] => Array [slug] => [customslug] => ) [11927] => Array ( [_id] => 19927 [analogi] => Array [artikul] => [bazovayaedinica] => Array [gruppy] => [id] => [kartinka] => Array [naimenovanie] => [price] => Array [up] => [ups] => 1 [ves] => [znacheniyarekvizitov] => Array [words] => [trigramms] => [seo] => Array [ishit] => [isview] => [actionPrice] => Array [vendor] => Array [delivery] => Array [storage] => Array [slug] => [customslug] => )
В целом - монга хороша для таких задач. Постгре, говорят тип json тоже сейчас имеет - тогда это идеальный вариант.