Versiune imprimabilă
Pentru aceasta, voi folosi limba PHP. Nu cunosc foarte bine această limbă, așa că am cerut să-mi ajut pe colegii mei programatori - aici este dezvoltarea web într-un mod femeie. Programatorii buni preferă să facă ceea ce nu a făcut nimănui, sau ce să facă este extrem de dificil, și pare a fi doar nerealist, tehnologia firmei noastre glorioase din grupul analogic (în special mulțumită lui mr.troll) nu face excepție. Site-ul companiei este, desigur, extrem de teribil, dar este o mișcare vicleană pentru a nu atrage clienți, iar apoi vin și plătește o gramada de bani, trebuie să muncim =). Probabil că autoritățile vor interzice acest articol în carte de cărți, dar trebuie să scrie.
Acum voi scrie cu un ajutor cum să optimizați și să efectuați căutarea de date în PHP.
Deci, sarcina: de a face o căutare după țară, și pentru Rusia, de asemenea, de orașe. Pentru a căuta după țară, descărcați fișierul din țările ip și despachetați fișierul GeoIPCountryWhois.csv din acesta.
Software-ul oferit pentru căutarea în acest fișier nu este, de asemenea, optimizat, deci optimizăm fișierul în sine:
În loc de 8 megabytes de date primite doar 1 megabyte, nu rău, nu? Acum, ceea ce am făcut aici, fișierul sursă este un tip:
Din site-ul ipgeobase.ru trebuie să descărcați fișierul db_files.tar.gz (sau .zip). Despachetați de acolo fișierul cidr_ru_slave_index.db în dosarul geo_ip, acolo pentru a arunca restul fermei. Acest fișier este un mic 300k, deci nu l-am optimizat.
Pentru a căuta ip-ul rus, trebuie să încărcați acest fișier în memoria principală (matrice) și apoi să căutați în matrice, funcțiile de căutare sunt:
În detaliu despre modul în care căutăm în întreaga lume: Un fișier cu date nu este încărcat în memoria RAM, ceea ce îl salvează mult. Căutarea și citirea sunt efectuate imediat din fișierul de pe disc. Căutarea este efectuată prin metoda dihotomiei, adică După fiecare iterare în buclă, știm numărul mai mare de care avem nevoie sau cel mai mic. Se pare că din cele 100000 de game putem găsi una de care avem nevoie cu maxim 17 încercări. Viteza de citire din fișier este cu adevărat extrem de rapidă, astfel încât viteza de căutare va fi mult mai rapidă decât cea sugerată de umi-cms și software-ul CN.
Puteți utiliza funcțiile după cum urmează:
Unde $ temp poate fi atât în format obișnuit 127.0.0.1 cât și în număr. În primul rând, o căutare este făcută pentru Rusia, iar dacă nu se găsește nimic, atunci este deja căutată în întreaga lume.
P.S. În momentul de față voi încerca să optimizez fișierul master, astfel încât 300 de kilobiți ai matricei nu pot fi încărcați în memoria RAM și pot căuta direct pe disc, deși acum căutarea utilizează și o dihotomie.
Articol Prokomentiru, cel puțin câteva cuvinte!
Mulțumesc foarte mult pentru articol, am încercat să înțeleg ce php arata și am văzut doar urme de C sau C ++ aici, deși acum este clar cum să scrieți programe pe el, să accesați fișiere, întrebarea este, ce mașină va fi procesată? pe serverul site-ului sau pe mașina vizitatorului?
în timp ce (! feof ($ handle)) - Nu cred că este cea mai bună opțiune (și brusc la sfârșitul dosarului există o mulțime de spații)
este mai bine să faci ceva pe similitudine în timp ce (fscanf (File, "% i.% i.% i.% i" IP1, IP2, IP3, ip4) == 4)
atunci când citește spațiile, va ajunge la fișierul fișierului și va reveni cu calm 0 sau un cod de eroare negativ și astfel pot apărea probleme în formă de date duplicat.
Cum de a lucra cu firul nu a înțeles, ați putea explica modul în care $ buffer = fgets funcționează ($ handle, 4096);
listă ($ start, $ stop, $ inetnum, $ country, $ city, $ region, $ district, $ status, $ slave, $ n_slave) = split ("", $ buffer);
PHP este un limbaj de server. Cea mai corectă modalitate este de a utiliza
în timp ce ($ buffer = fgets ($ handle, 4096))
fgets () - citește următoarea linie (maxim 4096 de caractere), în psx5 maximul nu poate fi specificat. lista și divizarea sunt funcții standard.
Vreau să observ că bazele de date IP rusești utilizate au o structură incorectă: nu există un singur nivel, ar trebui să existe cinci "sat / oraș-> district-> regiune / regiune-> subiect RF-> district administrativ". Prin urmare, această bază de date nu poate fi numită exactă.
Nu am găsit baza de date normală, așa că, din păcate. trebuie să folosească ceea ce este.
Și ce nivel nu este suficient? În opinia mea, nivelul orașului este destul de suficient pentru direcționare.