2010-12-20 117 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