Здравствуйте уважаемые специалисты в php и mysql. Поделитесь опытом.
Делаю роутер для своей CMS (с одной точкой входа index.php), описал такой метод для приема и разбора url - запросов от пользователей:
// Прием и разбор запросов
public function accept()
{
$url_el = array();
$url = $_SERVER['REQUEST_URI'];
if(preg_match("/[^a-zA-Z0-9\/\-\?\=\.\&\#]|(\?{2,}|\-{2,}|\/{2,}|\={2,})/" , $url))
return false;
$url = parse_url($url);
$url_el['path'] = $url['path'];
if(!empty($url['path']) && $url['path'] != '/')
{
if(preg_match("/^\/([a-z0-9\-]+)\.html$/", $url['path'], $ress))
$url_el['static'] = end($ress);
elseif(preg_match("/^\/([a-z0-9\-]+)\/$/", $url['path'], $ress))
$url_el['category'] = end($ress);
elseif(preg_match("/^\/([a-z0-9\-]+)\/([a-z0-9\-]+)\/$/", $url['path'], $ress))
{
$url_el['category'] = $ress[1];
$url_el['subcategory'] = end($ress);
}
elseif(preg_match("/^\/([a-z0-9\-]+)\/([a-z0-9\-]+)\.html$/", $url['path'], $ress))
{
$url_el['category'] = $ress[1];
$url_el['page'] = end($ress);
}
elseif(preg_match("/^\/([a-z0-9\-]+)\/([a-z0-9\-]+)\/([a-z0-9\-]+)\.html$/", $url['path'], $ress))
{
$url_el['category'] = $ress[1];
$url_el['subcategory'] = $ress[2];
$url_el['page'] = end($ress);
}
else
return false;
}
return $url_el;
}
Вопрос-1: Я не сильно дружу с регулярными выражениями, возможно есть другой способ сократить такой метод одной строкой?
Далее данные из массива
$url_el будут сопоставятся и проверятся из данными таблиц базы данных категорий и публикаций (pages) и если все Ок такой адрес существует в БД, тогда роутер подключает соответствующий модуль(класс) для дальнейшей обработки и вывода информации для запрошенного урл адреса.
Вопрос-2: Как вы считаете такой подход не сильно будет нагружать базу данных, если посещаемость сайта будет большая (для снижения такой нагрузки дальше планируется создать кеширование). Возможно стоит создать
временную таблицу БД куда будут входить элементы урл-адресов из обычных таблиц категорий и страниц? Но временные таблицы поддерживают не все хостеры.