2012-03-05 5 views
2

При сравнении следующих сценариев, какой из них был бы самым быстрым? Примерный примерный код ниже.php> performance> session vs globals vs db>?

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

У меня будет тонна функций используя эти значения уровня приложения, и я не хочу передавать их по аргументам, хотя я думаю, что это был бы самый быстрый способ. Мои параметры, похоже, работают с db look ups или с использованием сессионных варов или глобальных переменных.

Конечно, вы можете перейти на следующий уровень, бросив его. массивы в уравнение, чтобы сделать его быстрее/медленнее.

Другим фактором, который мы должны иметь в виду, является то, что мы говорим о множестве пользователей здесь.

Итак, что является лучшим способом бросить вокруг/работать с этими переменными уровня приложения в рамках отдельных функций?

//for global based approach 
$my_global_var1 = "abc"; 
$my_global_var2 = "xyz"; 

//for global + array based approach 
$my_globals['var1'] = "abc"; 
$my_globals['var2'] = "xyz"; 

//for session based approach 
$_SESSION['my_global_var1'] = "abc" 
$_SESSION['my_global_var2'] = "xyz"; 

//for session + array based approach 
$_SESSION['my_globals']['var1'] = "abc"; 
$_SESSION['my_globals']['var2'] = "xyz"; 

//for db based approach 
$varname = 'var1'; 

//or some other way, you may think of 
//?? 

function func1() 
{ 
    global $my_global_var1; 
    global $my_global_var2; 
    //.... 

    my_var1 = $my_global_var1; 
} 


function func2() 
{ 
    $my_var1 = $my_globals['var1']; 
} 

function func3() 
{ 
    $my_var1 = $_SESSION['my_global_var1']; 
} 

function func4() 
{ 
    $my_var1 = $_SESSION['my_globals']['var1']; 
} 

$my_var1 = func5($varname) 
function func5($varname) 
{ 
    return lookup($varname); 
} 
+5

Если эти значения не должны изменяться, вы должны использовать константы – soju

+0

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

+0

Есть ли причина, по которой вы не можете передать переменные? – AlexC

ответ

1

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

Что касается скорости, попробуйте измерить время выполнения скрипта с помощью microtime(). Вы можете использовать это (примечание: вход не продезинфицировать!):

<?php 
    $start = microtime(true); 
    if ($_GET['include']) { @include $_GET['include']; } 
    $end = microtime(true); 
    echo '<hr />'; 
    echo 'The script executed in: '.(($end - $start)*1000).' milliseconds.'; 
?> 

EDIT:

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

0

Вы должны передавать переменные функции, если это возможно.

Пример, где используются глобальные переменные:

<?PHP 
$Variable = '1234567'; 

function funcName() 
{ 
global $Variable; 
echo $Variable; 
} 
?> 

или вы могли бы просто сделать

<?PHP 
$Variable = '1234567'; 

funcName($Variable); 

function funcName($varPassed) 
{ 
echo $varPassed; 
} 
?> 

SESSION переменные используются для хранения настроек конкретного пользователя или переменной по нескольким загрузки страницы, или страниц , Они используются для хранения информации о сеансе (имя пользователя, пароль, последняя страница), но вы полностью контролируете его. Также переменные SESSION хранятся в файлах temp. Если материал, который вы храните для отдельных пользователей, затем используйте SESSION ... MySQL засорится, если не будет правильно настроен с соответствующими индексами и т. Д.

2

Я бы предложил использовать класс реестра для этого.

Я уверен, что есть больше чем один способ сделать такой класс, но я предпочитаю использовать один статический класс:

class Registry { 
    private static $values = array(); 

    public static function set($key, $value) { 
     self::$values[$key] = $value; 
    } 

    public static function get($key) { 
     return self::$values[$key]; 
    } 
} 

Тогда вы просто включить в реестр в верхней части приложения и его интерфейс во время с Registry::set('abc', 'xyz'); и Registry::get('abc');

несколько ссылок на этой технике:

http://www.devshed.com/c/a/PHP/Registry-Design-Pattern/

http://www.phpro.org/tutorials/Model-View-Controller-MVC.html#5