优化MySqli请求

时间:2015-12-21 14:52:52

标签: php mysql

我正在建立一个像控制台一样工作的网站。我有一个状态脚本,用于检查页面是否处于脱机状态,或者您是否已列入黑名单/列入白名单。我这样做是通过在我的数据库中查找IP来实现的。然后我使用开关指导用户。我使用javaScript重定向,因为该站点使用ajax而我无法获取标题('Location:xxx');使用它(另一个问题)。

当我使用状态页面运行站点时,它加载的速度是缓慢的两倍,并且每次用户使用命令时该页面都无法加载此脚本。

您对如何优化它以加快加载有任何建议吗?我愿意接受所有想法。谢谢你的时间。

 if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
        $ip = $_SERVER['HTTP_CLIENT_IP'];
    } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
    } else {
        $ip = $_SERVER['REMOTE_ADDR'];
};

$conn = new MySQLi('localhost', 'xxx', 'xxx', 'xxx');

$statusRank = "";

$sql = "SELECT enable FROM global WHERE enable = '1' AND setting = 'frontend'";
$query  = $conn->query($sql) or die ($conn->error);
if(mysqli_num_rows($query)) {
    $statusRank = "offline";
}

$sql = "SELECT ip FROM blacklist WHERE ip = '$ip'";
$query  = $conn->query($sql) or die ($conn->error);
if(mysqli_num_rows($query)) {
    $statusRank = "blacklist";
}

$sql = "SELECT ip FROM whitelist WHERE ip = '$ip'";
$query  = $conn->query($sql) or die ($conn->error);
if(mysqli_num_rows($query)) {
    $statusRank = "whitelist";
}

switch ($statusRank) {
    case "blacklist":
        ?><script>window.location.replace("include/blacklist.php");</script><?php
    break;
    case "whitelist":
    break;
    case "offline":
        ?><script>window.location.replace("include/offline.php");</script><?php
    break;
    default:
};

2 个答案:

答案 0 :(得分:1)

以下是一些最容易实现的想法:

  • 确保您在ipblacklist表格中的whitelist列上有索引。
  • 我对PHP不是很熟悉,但你应该使用持久连接。打开数据库连接是一项昂贵的操作。有关详细信息,请参阅php connection pooling mysql
  • 最后,您可以将三个查询合并在一起,而不是计算行,只需检查是否找到了ip。类似的东西:
SELECT
  CASE WHEN EXISTS 
    (SELECT * FROM global WHERE enable = '1' AND setting = 'frontend') THEN 'T' ELSE  'F' 
  END AS offline,
  CASE WHEN EXISTS 
    (SELECT * FROM blacklist WHERE ip = '$ip') THEN 'T' ELSE 'F'
  END AS blacklisted,
  CASE WHEN EXISTS
    (SELECT * FROM whitelist WHERE ip = '$ip') THEN 'T' ELSE 'F'
  END AS whilelisted

答案 1 :(得分:1)

为IP读取数据库一次,启动PHP会话,并将结果保存到它。所以在你从会话中读取的第二次和后续加载中。

我会将你的选择作为:

SELECT 'blacklisted' FROM blacklist WHERE ip = '$ip' JOIN
SELECT 'whitelisted' FROM whitelist WHERE ip = '$ip'

然后,您只需检查每一行的字符串并列入黑名单&#39;或者&#39;白名单&#39; (或更短的b / w)。