WebCM
unread,Apr 21, 2012, 10:43:59 AM4/21/12You do not have permission to delete messages in this group
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
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.