Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Czarna lista IP - jak wczytać i porównać?

74 views
Skip to first unread message

WebCM

unread,
Apr 21, 2012, 10:43:59 AM4/21/12
to
Istnieje długa lista 12635 adresów IP w takiej postaci:

#komentarz
#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. Chcę, aby cała operacja wykonała
się jak najszybciej bez wysokiego obciążenia serwera.

Oto kilka sposobów:

1. Wczytać plik funkcją file() do tablicy, a następnie in_array()
2. Wczytać plik file_get_contents() jako string, a potem strpos()
3. Zapisać plik jako tablicę PHP, a później include() i in_aray()
4. Wczytać plik do bazy danych, a potem proste zapytanie
5. Inny sposób? Ktoś ma propozycje?

Zmierzyłem czas i pamięć na PHP 5.3.1 pod Windows XP.

1. Czas: 18.3 ms, pamięć: 1.35 MB, szczyt: 1.86 MB
2. Czas: 2 ms, pamięć: 0.183 MB, szczyt: 0.516 MB
3. Czas: 40 ms, pamięć: 1.316 MB, szczyt: 3.078 MB
4. Czas: 0.7 ms, pamięć: 0.0012 MB, szczyt: 0.341 MB

Najszybciej wyszukuje baza. Adresy IP można zapisać jako INTEGER po
zamianie funkcją ip2long(). Testowane na SQLite. Bez wykorzystania
bazy danych najszybsze jest wczytanie całego pliku jako ciąg znaków i
użycie strpos(). Istnieje ryzyko, że zostanie zablokowany IP spoza
listy. Wzorzec 8.8.1.1 pasuje do 88.8.1.14. Zamiast tego można szukać
\n8.8.1.4\n o ile \n jest znakiem nowej linii.

Plik jest często aktualizowany, więc wygodniej będzie odczytywać go
bezpośrednio. Znacie inny sposób, aby sprawdzić IP na czarnej liście
jeszcze szybciej i z mniejszym obciążeniem? W ostateczności
wykorzystam bazę danych, tylko trzeba będzie napisać mechanizm
aktualizacji czarnej listy w CMS. Czarna lista jest w pliku .txt.

aaa

unread,
Apr 21, 2012, 3:33:32 PM4/21/12
to
5. Odczytać używając file, zamienić na integery zrobić tablice:
$tab[$adres_ip] = 1
Zapisać tablicę jako plik PHP.
Wyszukiwać robiąc include oraz if (isset($tab[$adres_ip]))

--
A

0 new messages