2015-09-05 2 views
-1

В настоящее время я использую switch($_GET['page']), чтобы выразить это просто. Это простое решение и работает в любом месте.Каков наилучший способ обработки переключения страниц?

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

Это моя база для, как я переключать страницы в данный момент:

// There is more complex .htacces to translation of friendly-urls behind it, but for example sake, these variables are being produced: 
$lext = array(
    'parent_page' => 'about-us', 
    'child_page' => 'map-to-somewhere', 
    'child_id' => NULL, // if it would be a article or something, it would be example.com/{parent_page}/{child_id}-some-friendly-url.html 
); 

switch ($lext['parent_page']) { 
    case 'about-us': 
     // about us page 
    break; 
    case '': 
     // home 
    break; 
    default: 
     // 404 
    break; 
} 

Внутри случаев коммутатора, он либо вызывает функцию или включает в себя файл. Как оказалось, для получения самых быстрых результатов загрузки страницы.

Так что мне интересно, для большого количества трафика и вашего «index.php» aka. файл посадки получает много хитов. Какое будет самое быстрое и самое простое решение?
Как простейших или глупейших решений, кажется, дает наилучшие результаты, я woulnt удивляйтесь, если:

if ($lext['parent_page'] == 'about-us') { 
    // about us page 
} else if ($lext['parent_page'] == '') { 
    // home 
} else { 
    // 404 
} 

..would быстрее и лучше beforming затем switch().

Я уже искал SO для подобных вопросов и тестировал все ответы, но те, которые я нашел, не работают лучше.

+0

Сколько страниц мы говорим здесь? Потому что, если у вас есть только 3 страницы, я сомневаюсь, что производительность будет увеличиваться, если вы используете другой метод. – Rimble

+0

@TomKriek На сайте, который получает много хитов, есть менее 10 страниц. Но может быть больше дочерних страниц. Однако они обрабатываются из функций или входят внутрь. Так что в настоящее время эта часть переключения страниц замедляет загрузку страницы. Другие проекты, имеют небольшой трафик, и это не проблема. Но на этом сайте постоянно работает около 600 пользователей, и это становится проблематичным. –

+0

дубликат дубликата дубликата ... поиск. –

ответ

1

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

Один из подходов может заключаться в том, чтобы перейти в мир фреймворков MVC, которые обычно имеют метод контроллера на странице, что дает вам приятный, чистый раскол в вашем коде. Например, с помощью кода воспламенитель вы указываете ваши страницы таким образом:

class MySite { 

    /* constructor etc */ 

    public function page_1() { 
     //this is called on visits to /page_1 
     //load a view for this page, etc 
    } 

    public function page_13() { 
     //this is called on visits to /page_3 
     //load a view for this page, etc 
    } 

} 

Более простой подход может создать файл в формате JSON данных из имеющихся случаев и что должно произойти в каждом из них.

{ 
    "page_1": {"inc": "page_1.php"}, 
    "page_13": {"func:": "some_func"}, 
} 

Тогда в вашем PHP:

//get data 
$data = @file_get_contents($fp = 'pages_data.txt') or die("Couldn't load ".$fp); 
$data = json_decode($data, 1); 

//look for requested page in data - if found, include file or run function... 
if (isset($data[$lext['parent_page']])) { 

    $item = $data[$lext['parent_page']]; 

    //...include file 
    if (isset($item['inc']) && file_exists($item['inc'])) 
     include $item['inc']; 

    //...run function 
    else if (isset($item'func']) && function_exists($item['func'])) 
     $item['func'](); 

} else 
    //404... 
} 
+1

Я вижу, очень интересный подход. Я попробую. Как JSON, мы используем для настроек на данный момент. Как получение их из SQL или memcaching их было медленнее. –

0

Зависит от того, как управлять ваши страницы. Если у вас есть require каждая страница файл, чем вы всегда можете загрузить этот файл просто:

$page = isset($_REQUEST['page']) ? $_REQUEST['page'] : 'index'; 

if (file_exists(__DIR__.'/views/'.$page.'.php')) { 
    require(__DIR__.'/views/'.$page.'.php'); 
} else { 
    switch ($page) { 
     // Custom rules that does not fit to previous rule. 
    } 
} 

Я предлагаю использовать структуру классов/действия для динамической загрузки запрошенной страницы (как и большинство структур).

[index.php] 

$route = isset($_REQUEST['route']) ? $_REQUEST['route'] : 'index'; 
$page = explode('/', $route); 

require_once(__DIR__.'/controller/'.ucfirst($route[0]).'Controller.php'); 

$className = ucfirst($route[0]).'Controller'; 
$class = new $className(); 
$class->{$route[1]}(); 

НЕКОТОРЫЕ ПРЕДОСТЕРЕЖЕНИЯ

Всегда старайтесь белый список ваших запросов, не забывайте пустые значения по умолчанию, используйте $_REQUEST, если вы можете передать информацию о маршруте через POST или GET.


для SEO Url, вы будете использовать .htaccess и базу данных.

+0

примечание: sanitize '$ page' (например:' ../ ') –

Смежные вопросы