我的PHP文件中有一个检查IP是否被禁止的函数。出于某种原因,我的网站非常慢,问题是当我检查IP是否被禁止时。
(我删除了检查的代码,我的网站又快了)
这是我的代码:
// index.php - everything redirects to this file in the .htaccess
<?php
include('config.php');
if(isIpBanned($_SERVER['REMOTE_ADDR'])) {
die('access denied');
}
// rest of the code
这是我的功能
// config.php
<?php
function isIpBanned($db, $ip) { // $db is declared correctly
$goodIP = $db->getRecord("SELECT is_banned FROM security.ip WHERE ip = '$ip'"); // this function works and return 1 or 0
return (bool)$goodIP;
}
此查询大约需要2秒到3秒才能运行。为什么?我没有离开加入或其他表格。
由于
答案 0 :(得分:26)
IP
列INT UNSIGNED
,ipv6合2 BIGINT UNSIGNED
):这会使您的表变小,并且会扫描期间需要较少的I / O 并且,作为旁注,即使$_SERVER["REMOTE_ADDR"]
应该是安全的,也不要忘记在SQL查询中撤消数据!
答案 1 :(得分:2)
在ip列上放一个索引。
网上有很多关于查询分析和改进的信息,所以我不会为你重复这些信息,但索引最明确的帮助。
我猜security.ip
是一个非常大的表,因此查找变慢。
索引的缺点:写入变得有点慢,所以如果你在该表中写了很多东西,你可以尝试将禁止部分卸载到新表中,比如banned_ips
。