2

我继承了一个要求用户登录的网站。

登录仅使用 Ajax 和 PHP,当只有 4000 个注册用户时,此登录过程可能需要一分钟才能完成。

这可能是由于登录的编码方式造成的吗?

AJAX

 <form name="login-form" onsubmit="return false">
            <input type="text" id="the_username" value="Username" onfocus="emptyUsername(this);" onblur="clickrecall(this,'Username')"  class="focusfield input push"  />
            <input type="password" id="the_password" value="Password" class="input" onfocus="emptyPassword(this);" onblur="clickrecall(this,'Password')" /> 
            <span id="dialog-login-fail" title="Login failed"></span>
            <input type="submit" onclick="javascript:void(0);"  id="loginBtnBre" class="sign-in signin-submit-btn" value="Login Now" /> 
 </form>

PHP

<?php
require 'config.inc.php';

foreach($_POST as $k=>$v) 
{
$_POST[$k] = trim($v);
}

if(!isset($_POST['theusername']) or !isset($_POST['thepassword']))
{
    print "Please use all fields";
}elseif(empty($_POST['theusername'])){
    print "Please enter a username";
}elseif(empty($_POST['thepassword'])){
    print "Please enter a password";
}elseif($_POST['theusername'] == "username" && $_POST['thepassword'] == "password")
{
    print "Password & User cannot be the ones already listed";
}elseif(!preg_match("/^[a-z0-9]+$/i", $_POST['theusername']))
{
    print "Please use only characters and numbers for username, no spaces, dashes or others!";
}else{

    $password = md5($_POST['thepassword']);
    $user = $_POST['theusername'];

    $loginVar = $usersClass->login($user, $password);

    if(is_array($loginVar))
    {
        $_SESSION['loggedIn'] = $loginVar; 
        @session_regenerate_id(true);

        print "success";

    }else{
        print "Whoops, something went wrong! Try again.";
    }
}

?>

询问

public function login($username, $password)
{

    $rs = mysql_query("SELECT `id`,`active` from `$this->usersTable` WHERE 
        `username` = '".mysql_real_escape_string($username)."' AND 
        `password` = '".mysql_real_escape_string($password)."'");

    if($rs) {
        $row = @mysql_fetch_object($rs);

            return $this->userInfo($row->id);

    }else{
        return false;
    }
4

3 回答 3

1

首先更改浏览器以确保它不是浏览器的问题(很少见,但有时仍然会发生)。

然后尝试使用 PHP 分析器来识别“慢”后端代码。http://erichogue.ca/2011/03/linux/profiling-a-php-application/甚至还有一个很好的教程

于 2012-10-08T10:49:21.720 回答
0

您可能在用户名或密码字段上没有索引

跑:

alter table `TableName` add index `username` (`username`(500));
alter table `TableName` add index `password` (`password`(500));

在 mysql 提示符下,其中 TableName 是您的表的名称,然后再试一次。如果这样可以加快速度,请将索引调整为更合适的长度。

而且您真的不应该将密码作为明文存储在数据库中。最低限度将它们存储为散列字符串(MD5 等),或者更好的是,将它们存储为加盐的 MD5 散列。

我会将您的选择更改为仅根据用户名进行选择(删除密码),然后执行其他检查以确保输入的密码与返回的行匹配。

于 2012-10-08T11:55:59.117 回答
0

您可以使用 firefox 的 firebug 功能来了解是否发布了正确的信息?我可以看到除了“登录”功能之外没有任何问题。您可以回显查询并将其从 firebug 复制并运行到数据库。跟踪运行该查询所需的时间并在其上添加一些时间。查看您的数据库查询是否需要大量时间。

如果您的查询需要更多时间,那么您需要优化您的 SQL 查询

于 2012-10-08T10:44:44.120 回答