php>表现> session vs globals vs db>?

时间:2012-03-05 14:46:01

标签: php performance

在比较以下情景时,哪一个最快?下面的示例示例代码。

基本上,我想要找出的是使用全球变量的最佳选择。 我存储的全局变量对所有用户都是相同的......它们是应用程序级别值,对于所有用户都是相同的,例如application_name或application_home_page_url ......

我将使用这些应用程序级别值有很多函数,我不想通过参数传递它们,虽然我认为这将是最快的方式..我的选项似乎是使用db查找,或者使用会话变量或全局变量..

当然,您可以通过抛出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);
}

3 个答案:

答案 0 :(得分:2)

我建议使用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

答案 1 :(得分: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.';
?>

编辑:

对我上面的帖子发表评论只是让我更了解你要做的事情。实际上,如果这些变量应保持不变,请使用常量。

答案 2 :(得分:0)

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

使用全局变量的示例:

<?PHP
$Variable = '1234567';

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

或者你可以做到

<?PHP
$Variable = '1234567';

funcName($Variable);

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

SESSION变量用于在多个页面加载或页面中存储特定于用户的设置或变量。它们用于存储会话信息(用户名,密码,最后一页),但您可以完全控制它。 SESSION变量也存储在临时文件中。如果存储的内容是针对个别用户的,那么使用SESSION ...如果没有正确设计索引,MySQL将会堵塞。