我正在为管理面板编写一个功能,阻止apache级别的ip地址。该文件名为blacklist.txt
,看起来像10.0.0.1,10.0.0.2,10.0.0.3, ...
所有单行,每个ip地址用逗号分隔。阅读What is the best way to write a large file to disk in PHP?后,我仍然不确定此事的最佳做法。
以下是我想要做的事情: IF 管理员按下'禁止锤',读取文件查找strpos($file, $ip)
,如果找不到,则附加到结尾文件和.htaccess文件相应地阻塞。
问题:是一个适合这个潜在大量数据的.txt文件吗?我不想执行查询来检查每次请求页面时是否禁止某人
修改: 目的是阻止在过去12小时内有10次失败登录尝试的单个IP地址。我认为'恢复我的密码'会阻止普通客户这样做。
答案 0 :(得分:3)
问题:是一个适合这个潜在大量的.txt文件 数据?
不,不是。具有适当索引的数据库是。
答案 1 :(得分:1)
首先以CSV格式阅读您的文件
你可以用很多方法。例如:
$rows = array_map('str_getcsv', file('myfile.csv'));
$header = array_shift($rows);
$csv = array();
foreach ($rows as $row) {
$csv[] = array_combine($header, $row);
}
src:http://steindom.com/articles/shortest-php-code-convert-csv-associative-array
用于检查每个页面上的加载并最小化该文件的读取
你可以使用内存缓存,比如memCache,然后在数组中搜索传入的ip。注意:内存缓存比数据库查询更快。
PHP共享内存ref:http://www.php.net/manual/en/book.shmop.php
memCache php.net/memcache
数组搜索php.net/in_array
如果找到值php.net/array_search
,也返回密钥注意:在1 mb文件中,你可以存储~65K IP,考虑到ip是以下格式:“255.255.255.255,”
如果你将数组的密钥放入ip,那就更好了,然后你可以检查密钥是否存在,而不是搜索数组:php.net/array_key_exists