php > performance > session vs globals vs db >?


php > performance > session vs globals vs db >?

在比较以下场景时,哪种场景最快?下面是示例代码。

基本上,我想找出的是使用全局变量的最佳替代方案。我存储的全局变量对所有用户都是一样的。。。它们是应用程序级别的值,对于所有用户都是相同的,例如application_name或applicationhome_page_url。。。

我会有很多函数使用这些应用程序级别的值,我不想通过参数传递它们,尽管我认为这是最快的方法。。我的选择似乎是使用数据库查找,或者使用会话变量或全局变量。。

当然,您可以将assoc.数组放入等式中,使其更快/?速度较慢。

我们必须记住的另一个因素是,我们在这里谈论的是很多用户。

那么,在单个函数中使用这些应用程序级变量的最佳方式是什么?

//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);
}

我建议为此使用Registry类。

我确信有不止一种方法可以创建这样的类,但我更喜欢使用一个静态类:

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

全局变量和会话变量背后的思想是不同的。全局变量用于在单个脚本中使用相同的变量,而不考虑范围。会话是为一个用户跨页面存储变量。如果我理解您试图正确地做什么,那么使用会话变量可能会更好。

关于速度,请尝试使用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.';
?>

编辑:

你在我上面的帖子的评论让我更好地理解了你想做什么。事实上,如果这些变量应该保持不变,就使用常量。

如果可能的话,应该将变量传递给函数。

使用全局变量的示例:

<?PHP
$Variable = '1234567';
function funcName()
{
global $Variable;
echo $Variable;
}
?>

或者你可以做

<?PHP
$Variable = '1234567';
funcName($Variable);
function funcName($varPassed)
{
echo $varPassed;
}
?>

SESSION变量用于跨多个页面加载或页面存储特定于用户的设置或变量。它们用于存储会话信息(用户名、密码、最后一页),但您可以完全控制它。session变量也存储在临时文件中。如果你存储的东西是为个人用户准备的,那么使用SESSION。。。MySQL如果没有正确设计索引等,就会阻塞。