2012-03-05 63 views
2

比較以下情況時,哪一個最快?下面是示例代碼示例。php> performance> session vs globals vs db>?

基本上,我試圖找出什麼是使用全局變量的最佳選擇。 我存儲的全局變量對所有用戶都是一樣的......它們是所有用戶相同的應用程序級別值,例如application_name或application_home_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); 
} 
+5

如果這些值不應該改變,您應該使用常量 – soju 2012-03-05 14:49:41

+0

此外,會話是爲每個訪問者設置的,因此您將多次存儲相同的信息。 – jeroen 2012-03-05 14:52:57

+0

有沒有理由不能傳遞變量? – AlexC 2012-03-05 14:56:24

回答

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.'; 
?> 

編輯:

我上面給你的帖子的評論只是讓我更好地瞭解你想要做什麼。事實上,在這些變量應該保持不變的情況下,使用常量。

0

如果可能,您應該將變量傳遞給函數。

例子,其中使用全局變量:

<?PHP 
$Variable = '1234567'; 

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

,或者你可能只是做

<?PHP 
$Variable = '1234567'; 

funcName($Variable); 

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

Session變量是用來存儲在多個頁面加載或頁面用戶特定設置或變量。它們用於存儲會話信息(用戶名,密碼,最後一頁),但您可以完全控制它。 SESSION變量也存儲在臨時文件中。如果你存儲的東西是針對個人用戶的,那麼使用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