2010-12-20 118 views
1

想知道哪個更適合性能。該網站將被登錄的用戶和沒有登錄的用戶查看。除了擁有更多權限之外,登錄用戶的網站幾乎相同。所以我想知道什麼會更有效率。PHP性能問題

// OPTION ONE

if(isLoggedIn()){ 
Write the whole web site plus the content the logged in user can access 
} 
else { 
Write the whole website again, minus the content the logged in users can access. 
} 

//OPTION TWO 
Write the website content and inset the login function wherever i need to restrict the access, so the function would be called a few different times. 

我想知道它是否將是一個使用選項之一,因爲該功能將首先檢查一次更好的性能,並且不會需要重新檢查,如果用戶如果用戶沒有登錄,它會忽略第一個塊並加載第二個塊。

+0

總之,什麼更容易維護?開發人員比服務器更昂貴(無論如何都是在低流量級別),所以請使用易於維護的版本(這恰好是#2)... – ircmaxell 2010-12-20 19:33:24

+0

另一個蹩腳的問題。事實上,這個問題與性能調整無關,你無法調整任何這種蹩腳的方式。學習分析 – 2010-12-20 20:01:05

回答

2

兩者。

你不想每次檢查isLoggedIn()(特別是如果它打到數據庫),因爲那樣會很慢。但是你不想擁有2個版本的HTML,因爲它是不可維護的。

在頂部檢查一次並設置一個變量(或使用會話變量並檢查它)。然後在HTML中使用if語句來對變量進行判斷以確定顯示內容。例如:

PHP:

$logged_in = false; 
if(isLoggedIn()) { 
    $logged_in = true; 
} 

HTML:

<?php if($logged_in) { ?> 
<div> 
    Super-secret needs a login stuff 
</div> 
<?php } else { ?> 
<div> 
    Sorry! You have to login to see this cool stuff 
</div> 
<?php } ?> 
+0

爲什麼不簡單地使用'$ logged_in = isLoggedIn()'? – Gumbo 2010-12-20 19:33:18

+0

@Gumbo:也適用。我只是想詳細說明:) – Cfreak 2010-12-20 19:33:48

+1

除非數據庫或網絡出現性能問題,否則單擊某個頁面的數據庫並不算什麼大問題。我有一個10萬頁以上的網站,每天收到35K次點擊; *每個*頁面都會訪問數據庫,並且我們在Web和SQL服務器上的CPU利用率都達到了4%左右。 – 2010-12-20 19:54:18

5

都沒有。最好的選擇是檢查isLoggedIn一次,保存結果,並在源內部進行交換。

+1

'$ loggedIn = isLoggedIn(); //寫一些東西;如果($ loggedIn)//寫一些東西; //寫一些更多的東西' – 2010-12-20 19:28:46

+0

是的,就像上面一樣。 – DampeS8N 2010-12-20 19:29:29

+0

+1打我到正確的答案。 – Cfreak 2010-12-20 19:31:15

5

第二個選項的性能可以忽略不計,但是更好的選擇是因爲它減少了代碼重複。此外,如果將isLoggedIn()的結果緩存在靜態變量中,則不必在每次調用該方法時都執行所有檢查。你可以檢查你的靜態變量並提前跳出。

function isLoggedIn() { 
    static $is_logged_in = null; 

    if(!is_null($is_logged_in)) { 
     return $is_logged_in; 
    } 

    //... user is known not to have valid credentials 

    $is_logged_in = false; 

    // ... User has been validated 

    $is_logged_in = true; 

    //... 


} 
+3

你最好把它默認爲'null'並檢查'is_null($ logged_in)'爲真時的狀態。 – Gumbo 2010-12-20 19:31:33

+0

@Gumbo,爲什麼'null'?我們假設用戶沒有登錄('false')開始,一旦我們確定他們已經登錄('true'),就會有一個覆蓋。我看到這裏不需要空的'null'。儘管如此,請隨時糾正我。 – Craige 2010-12-20 19:35:13

+3

,因爲你無法區分實際的'false'和未初始化的'false'。因此,對於未登錄的用戶,它會對每次呼叫進行檢查。如果if(!is_null($ logged_in)){return $ logged_in; }'允許你緩存呼叫,不管結果如何... – ircmaxell 2010-12-20 19:37:56

1

我會說,如果你能,保持對誰不登錄的人緩存版本,當產生的一切他們已登錄。

1

爲了分離顧慮,讓客戶端瀏覽器爲登錄用戶添加功能可能是可行的。這意味着你發送一個靜態版本的網站,並且Javascript檢查客戶端是否存在登錄cookie。如果存在,則會顯示少數其他GUI元素或允許的鏈接。

JS禁用的瀏覽器看不到任何東西的明顯隱患。除非你用CSS .optional-func來裝飾元素,並禁用/啓用:

if (!document.cookies.match(/login/)) { $(".user-funcs").hide(); } 
+1

-1用於客戶端驗證,以及不會以友好方式降級的JS。 – Craige 2010-12-20 19:45:49

+0

@Craige:這就是我所說的。以上解決方案已經優雅地降級(默認情況下可見,只有在JS啓用時才隱藏),以防萬一您錯過了它。 – mario 2010-12-20 19:56:28

+0

這不會被認爲是有辱人格的,因爲絕對沒有用戶可以在沒有JS的情況下登錄。這極大地阻礙了可用性。 – Craige 2010-12-20 19:59:59