使用PHP和MySQL进行登录确实很慢

时间:2013-01-20 20:55:51

标签: php mysql ajax

我正在使用旧网站广告登录功能永远。我试图找到这个底部,但我不确定是什么导致它。

登录功能使用AJAX。

AJAX

$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.";
}

PHP Class

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 个答案:

答案 0 :(得分:3)

由于您没有索引,我建议在usernamepassword上添加综合索引:

CREATE INDEX `idx_user_pass` ON `user_table` (`username`, `password`)

查看MySQL CREATE INDEX syntax以获取完整详情。

正如我在评论主题中所提到的,你的代码没有任何本质上的缓慢。

我会注意到一些需要注意的事情(我怀疑你知道这一点,因为你很长一段时间都是SO成员)。建议删除@错误抑制运算符。您确实已经对$rs进行了错误检查,因此此处无需进行额外的抑制。

$row = @mysql_fetch_object($rs);
//----^^

我知道你已经熟悉PDO并准备了其他问题的陈述,所以不需要进入......

答案 1 :(得分:1)

好吧,似乎ike一切都正常,代码本身,它可能是有麻烦的服务器,它减慢了脚本。 另外,$password = md5($_POST['thepassword']); $user = $_POST['theusername'];: 不要再使用md5哈希了,而是去sha2,对于用户来说,请至少使用mysql_real_escape_string来保证它周围的安全:)

答案 2 :(得分:0)

  1. 尝试使用PDO或mysql_fetch_assoc,根据PHP.net,这个函数比mysql_fetch_assoc稍慢,
  2.   

    速度方面,该函数与mysql_fetch_array()相同,并且   几乎与mysql_fetch_row()一样快(差别无关紧要)。

    1. Echo比打印稍快;
    2. 但即使您的代码具有更好的性能,我也怀疑它与您的代码有关。我认为数据库有点慢,你在你正在搜索的fiels中使用带有索引的INNODB吗?这要快很多..

答案 3 :(得分:0)

首先如评论中所述,您应该检查您的表是否有索引。为此,您可以通过运行此查询来确定是否是这种情况:

EXPLAIN SELECT id, active FROM [users_tables] WHERE `username` = '[username]' AND `password` = '[password]'

(用权利值替换[...])

然后,我认为你应该避免在session_generate_id和mysql_fetch_object之前使用@。

另外,检查函数userInfo是否没有执行另一个MySQL请求,如果你有一个忙表,一旦你检查登录密码,最好是获取所有数据,而不是两次。

最后,将你的表(谨慎使用此过程,你可以丢失数据)从MyISAM更改为InnoDB,因为最后一行每行锁定一次,MyISAM每表锁定一次。