@baracuda2

Какой вариант чпу лучше?

Искал как сделать чпу, в итоге написал сам. Через пару часов наткнулся на готовы вариант от любителя-профессионала.
Собственно вопрос какой вариант лучше выбрать?
по быстродействию
по нагрузки
по защите


Я думаю что мой вариант хоть и по новее, но проиграет.
<?php
class Router {
    private $_route = array(); 
    public function setRoute($dir, $file) {
        $this->_route[trim($dir, '/')] = $file;
    }
    public function route() {
        if (!isset($_SERVER['PATH_INFO'])) { 
            include_once 'index.html'; 
        } elseif (isset($this->_route[trim($_SERVER['PATH_INFO'], '/')])) { 
            include_once $this->_route[trim($_SERVER['PATH_INFO'], '/')]; 
        }
        else return false; 
        return true;
    }
}
$route = new Router;
$route->setRoute('page/name', "1.html"); 
$route->setRoute('page-2', "2.html");
$route->setRoute('post', "3.html");
if (!$route->route()){echo '404';}

htaccess
RewriteEngine on

RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d

RewriteRule ^(.*)$ index.php/$1

Скрипт не дописан, решил упростить и поэтому без базы.
Если он лучше подходит то продолжу его дописывать, базу просто подключить)


И собственно найденный скрипт
<?php
	$mysqli = new mysqli("localhost", "root", "", "lesson-local");
	function replaceSEF($content) {
		global $mysqli;
		$regex = "[(<a[^>]*href\s*=\s*[\"'])([^'\"]*)([\"'][^>]*>\s*.*?\s*</a>)]i";
		preg_match_all($regex, $content, $matches);
		for ($i = 0; $i < count($matches[2]); $i++) {
			$temp = str_replace("&amp;", "&", $matches[2][$i]);
			$result_set = $mysqli->query("SELECT `alias` FROM `sef` WHERE `link`='$temp'");
			$row = $result_set->fetch_assoc();
			$content = str_replace($matches[2][$i], $row["alias"], $content);
		}
		if ($result_set) $result_set->close();
		return $content;
	}
	function getContent($alias) {
		global $mysqli;
		$content = "Моя страница <a href='/?view=article&amp;id=1'>тут</a> и ещё вот <a href='/?view=section&amp;id=1'>это</a>";
		$result_set = $mysqli->query("SELECT `link` FROM `sef` WHERE `alias`='$alias'");
		$row = $result_set->fetch_assoc();
		if ($result_set) $result_set->close();
		$vars = parse_url($row["link"]);
		parse_str($vars["query"], $vars);
		if ($vars["view"] == "article") $content .= "<br />Статья с ID=".$vars["id"];
		elseif ($vars["view"] == "section") $content .= "<br />Раздел с ID=".$vars["id"];
		else $content = "404 Not Found";
		return $content;
	}
	
	
	$content = getContent(substr($_SERVER["REQUEST_URI"], 1));
	echo replaceSEF($content);
	$mysqli->close();
?>

htaccess
AddDefaultCharset UTF-8

RewriteEngine on
Options +FollowSymlinks
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*) /?%{QUERY_STRING}


Он уже готовый и работает с базой
  • Вопрос задан
  • 2527 просмотров
Пригласить эксперта
Ответы на вопрос 2
@bromzh
Drugs-driven development
Эскобар.жпг. Оба ужасны.
Посмотри, как это реализовано в нормальных фреймворках.
Ответ написан
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
1. Много лишних действий в классе. Зачем заносить пути в класс, если они будут использоваться однократно?! switch не проще поставить?
2. Не нужно делать trim 100 раз подряд над одной и той же переменной - все необходимые преобразования до ветвления.
3. Сохраняйте сразу в 2 глобальные переменные: имя сервиса и переменные сервиса. (explode по имени сервиса, и берите как 2-й параметр: [1])
4. Избавляйтесь от класса - он здесь лишний. (достаточно двух глобальных переменных)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы