我正在建立一个像控制台一样工作的网站。我有一个状态脚本,用于检查页面是否处于脱机状态,或者您是否已列入黑名单/列入白名单。我这样做是通过在我的数据库中查找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:
};
答案 0 :(得分:1)
以下是一些最容易实现的想法:
ip
和blacklist
表格中的whitelist
列上有索引。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)。