[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: ЧПУ и вопрос по нагрузке
dropoff
Доброго времени суток.

Ребята, такой вопрос.
Сделал ЧПУ такое

$url = preg_replace("/\/+/",'/', $_SERVER['REQUEST_URI']);
$url = preg_replace("/^\/(.*)\/?$/U", '\\1', $url);
$url = preg_replace("/^(.*)\?.*$/U", '\\1', $url);
$url = explode("/", $url);

switch ($url)
{
case 'news':
var_dump($url); break;

default:
var_dump($url);
}
?>

<ul style="float:left;width:150px;">
<
li><a href="/">index</a></li>
</
ul>
<
ul style="float:left;width:150px;">
<
li><a href="/news">news</a></li>
<
li><a href="/news/category-name">news category-name</a></li>
<
li><a href="/news/category-name/news-name">news news-name</a></li>
</
ul>


.htaccess
RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [L,QSA]


В итоге, при запросе site.ru/categoriya
я в БД запрашиваю WHERE url = 'categoriya'

Не будет ли из-за этого сильной нагрузки, если будет очень много категорий?



Спустя 13 минут, 53 секунды (7.02.2012 - 08:10) nugle написал(а):
dropoff
Вот в чем у тебя сила нагрузки измеряется? В Ньютонах, в пряниках, в метрах? Сама ЧПУ эту уже нагрузка + регулярки, которые в свою очередь занимает тоже большое количество ресурсов.
Почему бы RewriteRule не сделать таким
RewriteRule ^(.*)$ index.php?route=$1 [L,QSA]

? В итоге ты имеешь одну переменную? explode приходишься и у тебя их уже не одна, а четыре к примеру

Спустя 7 минут, 43 секунды (7.02.2012 - 08:17) dropoff написал(а):
Я имел в виду нагрузку на выборку из БД.
Т.е. тут же получается, что УРЛ может быть до 200 символов.
Если УРЛ site.ru/categoriya-novosti/dlinnoe-nazvanie-nashey-novosti

то выборка будет сначала в категории categoriya-novosti, а потом будет выбирается наша новость по УРЛу WHERE url = 'dlinnoe-nazvanie-nashey-novosti'

А если новостей будет, скажем 50000?

Меня эта нагрузка интересует.

Спустя 7 минут, 23 секунды (7.02.2012 - 08:25) dropoff написал(а):
nugle, не понял немного
Цитата
В итоге ты имеешь одну переменную? explode приходишься и у тебя их уже не одна, а четыре к примеру

Спустя 5 минут, 57 секунд (7.02.2012 - 08:31) nugle написал(а):
dropoff
Цитата
nugle, не понял немного

Там я говорил про не много другую структур ЧПУ.
Но теперь понял, что вопрос не в этом. Нагрузка действительно будет большая, так как у тебя не совсем верная структура таблицы, надо в таблице с новостями указывать категорию, типо этого
Цитата
id | id|category | name | text

Спустя 9 минут, 5 секунд (7.02.2012 - 08:40) sergeiss написал(а):
Цитата (dropoff @ 7.02.2012 - 09:17)
Если УРЛ site.ru/categoriya-novosti/dlinnoe-nazvanie-nashey-novosti

то выборка будет сначала в категории categoriya-novosti, а потом будет выбирается наша новость по УРЛу WHERE url = 'dlinnoe-nazvanie-nashey-novosti'

Тут не совсем понятно.
1. Зачем делать категорию новости, если у тебя есть длинное имя? Я бы сделал или site.ru/dlinnoe-nazvanie-nashey-novosti (без категорий вообще) или site.ru/news/dlinnoe-nazvanie-nashey-novosti (общая категория - новости)
2. И даже если использовать категории, то искать в БД можно сразу по 2-м параметрам: категория и имя. 50 тысяч новостей - не так и много smile.gif Сделай правильные индексы и всё будет быстро искаться.

Спустя 14 минут, 44 секунды (7.02.2012 - 08:55) dropoff написал(а):
категории новостей в данном случае нужны в УРЛе.

БД
категория новостей
id | cat_title | cat_url

новости
id | news_title | news_desc | news_url

при запросе сайт.ру/categoriya-novosti/dlinnoe-nazvanie-nashey-novosti
я проверяю категорию categoriya-novosti, если такая категория есть, то ниже делаю запрос на выборку новостей, но уже по ID категории(я же получил уже категорию по URL).
Т.е. выборка новостей ИЗ категории идет не по УРЛу, а по ID

Как я понял, то индекс нужно ставить на id категории, на url категории, и в таблице новостей так же, на id новости и на url новости?

P.S. Дело в том, что скрипт старый. Переписывать весь под какие-то новые форматы смысла нет, а ЧПУ нужно.
единственный доступный для меня вариант - который привел выше, других простых не находил. Я его понимаю и не сложно под него изменить скрипт.

Спустя 2 минуты, 2 секунды (7.02.2012 - 08:57) nugle написал(а):
sergeiss
Ну к примеру для чего ему необходимо название категория, ну может быть для тех же хлебных крошек, хотя join ом тоже можно вытащить

dropoff
я например не вижу у тебя в структуре таблицы новостей, чтобы было id категории новости

Спустя 4 минуты, 39 секунд (7.02.2012 - 09:01) dropoff написал(а):
а. сори, не упомянул. там есть таблица связей news_to_categories
где идут связи id новости и id категории.
так как одна новость может быть у нескольких категорий.

Спустя 2 часа, 9 минут, 27 секунд (7.02.2012 - 11:11) dropoff написал(а):
Тогда еще такой вопрос.
К примеру я проставлю правильно индексы и т.д.. у таблиц.

Но если будет записей 100-300к и будет большая посещаемость, например 5к юзеров сутки.
Скрипт же наверное просто загнется делая выборки по string?

Понятно, что можно VPS по мощнее и прикрутить, например, мемкэш(или мемкэш тут не спасет?)...

каким образом можно в такой системе снизить нагрузку до какого-то минимума? Может выборку из БД как-то иначе делать?

Спустя 11 минут, 34 секунды (7.02.2012 - 11:22) Zerstoren написал(а):
Я так понимаю, в ваш дом пришли SEOшники.
Так вот, вполне допустимый вариант это
example.com/id-categoryName/id-someNews/
example.com/25-worl-news/5025-microsoft-collapse/

Это не на столько принципиально в ЧПУ.
Поисковику нужно найти как минимум часть вхождения, а не все 100%, от слеша до слеша.

Так что тут можете быть спокойны.

Спустя 1 час, 25 минут, 41 секунда (7.02.2012 - 12:48) dropoff написал(а):
Именно. Пришли СЕОшники)

По этому поводу, думал сделать уже чистые УРЛы, вообще без id.
Но как видно, вариантов легких такое сделать нет(

Спустя 1 час, 50 минут, 26 секунд (7.02.2012 - 14:38) Zerstoren написал(а):
Цитата (dropoff @ 7.02.2012 - 09:48)
Именно. Пришли СЕОшники)

По этому поводу, думал сделать уже чистые УРЛы, вообще без id.
Но как видно, вариантов легких такое сделать нет(

Я сейчас работаю в компании Netpeak, которая занимается как раз этим гребаным СЕО, так вот. Посмотрите на slando.com.ua и другие сайт сландо.

Мы над ними работаем и такие погрешности не очень страшны.

Спустя 4 часа, 53 минуты, 20 секунд (7.02.2012 - 19:32) dropoff написал(а):
Ну такие УРЛы не погрешность, я имею в виду site.ru/97-cat/45-news
просто подумал, что без id будет еще лучше.
Ведь url вида
site.ru/asus/asus-lamborghini
лучше, чем
site.ru/5-asus/46-asus-lamborghini

Сейчас ковыряю WordPress, пробую понять как там такое реализовано.
Но что-то мне подсказывает, что ничего не пойму))

Хотя можно же и кэшировать запросы.
Проблема будет только с вытягиванием именно полной новости, если в БД их скажем 500к.
Категорий то будет от 5 до макс 100 штук.

Спустя 17 часов, 6 минут, 6 секунд (8.02.2012 - 12:38) Zerstoren написал(а):
Можете попробовать сделать двоичный поиск id.

Делаете индексный файл, в нем id => chpu
И когда запрашивается ссылка, вы можете ее очень быстро найти.
Как ни как бинарный поиск работает быстрее чем линейный, который используется в mysql при поиске текстового значения.

Но не забывайте, все данные для бинарного поиска должны быть отсортированы.

Спустя 1 час, 1 минута, 19 секунд (8.02.2012 - 13:39) dropoff написал(а):
Ох. Хотелось бы все в БД держать

А если пробовать кодировать УРЛ? Например получать контрольную сумму и писать ее то же в таблицу и поиск уже делать сразу по сумме и по УРЛ?
Или может что-то подобное сделать?
Строки же можно наверное переводить в числовые и их писать?

И еще такой вопрос.
Что лучше.
1 - Использовать одну таблицу для всех ссылок на сайте
группировать по типам.
id - id записи
type - тип (новость, статья, страница)
url - УРЛ


2 - Писать УРЛ в таблицу типа данных (новости, статьи, страницы)
?

Если 1 вариант, то нужно будет постоянно join'ить таблицу. Но с другой стороны, можно будет удобно проверять любой УРЛ на существование.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.