2015-12-21 66 views
0

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

当我使用状态页面运行该站点时,它的加载速度降低了一倍,并且每次用户使用命令时都无法帮助该页面加载此脚本。

对于如何优化加载速度,您有什么建议吗?我为所有想法开放。谢谢你的时间。

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: 
}; 
+0

哪一个是加载速度慢的查询? “两次慢”是没有价值,你可以使用..是毫秒?分钟?小时?没有你的表格结构/索引,就没有机会帮助你。 – Olli

+0

对不起......我从接近瞬间开始,可能会在300-500毫秒左右,当脚本启用+/- 2秒。 –

回答

1

这里是从最简单的开始实施的一些想法:

  • 确保您有在blacklistwhitelist表的ip列的索引。
  • 我不是很熟悉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

阅读DB曾经为IP,开始PHP会话,并将结果保存到它。因此,在第二次和随后的加载中,您从会话中读取。

我会让你的选择是:

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

然后你只需要检查每一行字符串“黑名单”或“白名单”(或B/W较短)。