Kod
#komentarz
#inny komentarz
adres IP
adres IP
adres IP
...
#inny komentarz
adres IP
adres IP
adres IP
...
Przy wczytywaniu trzeba pominąć komentarze, a następnie sprawdzić, czy adres IP użytkownika jest w bazie. Boty często atakują serwisy masowo, dlatego nie można zarżnąć serwera. Oto kilka sposobów:
1. Wczytać plik funkcją file() do tablicy, a następnie in_array()
2. Wczytać plik funkcją file_get_contents() jako ciąg znaków, a następnie strpos()
3. Zapisać plik jako tablicę PHP, a później include() i in_aray()
4. Wczytać plik do bazy danych, a potem sprawdzać prostym zapytaniem, czy IP jest w bazie
5. Inny sposób?
Zmierzyłem czas i pamięć sposobów 1,2,3,4 na PHP 5.3.1 pod kontrolą Windows XP. Wyniki:
1. Czas: 18.3 ms, pamięć: 1.35 MB, szczytowa: 1.86 MB
2. Czas: 2 ms, pamięć: 0.183 MB, szczytowa: 0.516 MB
3. Czas: 40 ms, pamięć: 1.316 MB, szczytowa: 3.078 MB
4. Czas: 0.7 ms, pamięć: 0.0012 MB, szczytowa: 0.341 MB, baza SQLite 3
Uwagi do poszczególnych sposobów:
1. Chociaż sposób zapewnia 100% skuteczność, jest wolny przy dużej liczbie linii
2. Działa szybko, ale może blokować adresy spoza listy, np. wzorzec 80.0.0.0 pasuje do 180.0.0.0
3. To mnie zaskoczyło, bo kod PHP z tablicą wczytuje się najdłużej i pożera pamięć!
4. Nie wiemy, ile pamięci używa baza. Odczyt z SQLite szybki, podobnie będzie w MySQL.
//Metoda 1 //Metoda 2 //Metoda 3 require './blacklist.php'; //Metoda 4 $q = $db->prepare('SELECT * FROM blacklist WHERE IP=?'); //IP typu INTEGER $x = $q->fetchColumn(); //Metoda pomiarowa czasu $ip = 'dowolny IP (w moich testach był spoza czarnej listy)'; // .. w tym miejscu kod, który wczytuje listę i sprawdza IP .. //Metoda pomiarowa pamięci $ip = 'tu adres IP'; $m = xdebug_memory_usage(); // .. w tym miejscu kod, który wczytuje listę i sprawdza IP .. $x = xdebug_memory_usage();