2010-12-20 13 views
1

パフォーマンスの面では驚異的です。サイトは、ログインしている人とそうでない人によって表示されます。彼らはより多くのprivledgesを持っている以外は、ログインしているユーザーのサイトはほとんど同じです。だから私はもっと効率的であると思っています。PHPのパフォーマンスの質問

関数が最初に一度にチェックされるだろう、とユーザーならば、再度チェックする必要がないため、それはオプション1を使用してパフォーマンスのためのより良いでしょう場合、私は疑問に思って

// 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. 

ユーザがログインしていなければ、最初のチャンクを無視して2番目のチャンクをロードします。

+0

を、維持するために簡単です何?開発者はサーバーよりも高価です(とにかくトラフィック量が少ない)ので、バージョンを維持するのが簡単になります(#2のようになります)。 – ircmaxell

+0

別の質問があります。実際、この質問はパフォーマンスのチューニングとは関係がありません。このようなやり方では何も調整できません。プロファイリングを学ぶ –

答えて

2

両方。

いつもisLoggedIn()(特にデータベースにヒットする場合)が遅くなるため、チェックしたくないです。しかし、HTMLの2つのバージョンを持っているのは、維持できないからです。

一番上に一度チェックし、変数を設定します(またはセッション変数を使用してチェックします)。次に、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

+0

@ Gumbo:同様に動作します。私は冗長であるのが好きです:) – Cfreak

+1

あなたのデータベースやネットワークにパフォーマンスの問題がなければ、ページのデータベースへのシングルヒットは大したことではありません。私は1日あたりおよそ35Kヒットを受け取る100k +ページのサイトを持っています。 *すべてのページがデータベースにヒットし、WebサーバーとSQLサーバーの両方で約4%のCPU使用率で実行されています。 –

5

どちらもありません。一番良い方法は、isLoggedInを一度チェックして結果を保存し、ソース内でifsを実行して各場所でスワップすることです。

+1

'$ loggedIn = isLoggedIn(); //いくつかのものを書く; if($ loggedIn)//いくつかのものを書く;//上記のように、もう少し多くのものを –

+0

うまく書いてください。 – DampeS8N

+0

正解に私を打つため+1。 – Cfreak

5

2番目のオプションはパフォーマンスが重視されることはほとんどありませんが、コードの重複が少なくなるため、より優れたオプションです。

静的なvarにisLoggedIn()の結果をキャッシュする場合、メソッドの呼び出しごとにすべてのチェックを実行する必要はありません。静的なvarを確認して、早めに飛び出すことができます。

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

+0

@Gumbo、なぜ 'null'ですか?ユーザーはログインする前に( 'false')ログインしていないと仮定して、ログインしたと判断できるようにするだけです(' true')。ここでは空の 'null'は必要ありません。それでも私を修正してください。 – Craige

+3

実際の 'false'と初期化されていない' false'を区別できないためです。したがって、ログインしていないユーザーの場合は、毎回チェックを実行します。一方、if(!is_null($ logged_in)){return $ logged_in; } 'は、結果にかかわらず呼び出しをキャッシュすることができます。 – ircmaxell

1

あなたは、ログインしていない人のためにキャッシュされたバージョンを保持し、ときにすべてを発生させることができれば、私は、言います彼らはログインしています。

1

問題の分離のために、クライアントブラウザーにログインしたユーザーのための機能を追加させることができます。つまり、Webサイトの静的バージョンを1つ送信し、Javascriptはクライアント側でログインCookieが存在するかどうかをチェックします。存在する場合、いくつかの追加のGUI要素または許可されたリンクが表示されます。

JSが無効になっているブラウザには何も表示されないという明らかな落とし穴があります。あなたはFUNC-.optionalおよび無効化CSSで要素を飾るない限り、/それを有効にします。要するに

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

-1のように、クライアント側の妥当性検査のために、また、JSにはやさしい方法で劣化しません。 – Craige

+0

@Craige:それは私が言ったことです。また、上記の解決策は既に正常に機能していません(デフォルトで表示され、JSが有効な場合のみ表示されます)。 – mario

+0

は、正常に機能しなくなるとは考えられません。ユーザーがJSなしでログインすることは絶対にできません。これはユーザビリティを大きく阻害します。 – Craige