@@ -84,7 +84,7 @@ public function __construct($databaseFile)
8484 'dit ' => $ dit ,
8585 'version ' => $ tmp ['ver ' ],
8686 ];
87- if ($ this ->meta ['version ' ] !== self ::VERSION ) {
87+ if ($ this ->meta ['version ' ] != self ::VERSION ) {
8888 fclose ($ this ->db );
8989 $ this ->errors [] = 'file ' .$ databaseFile .' is not database version ' .self ::VERSION ;
9090 return ;
@@ -137,7 +137,6 @@ public function find($ip)
137137 {
138138 if (!filter_var ($ ip , FILTER_VALIDATE_IP )) return false ;
139139 if (!$ this ->isCorrect ) return false ;
140- $ registers = false ;
141140 $ data = array ();
142141 $ octet = (int )$ ip ;
143142 $ long = pack ('N ' ,ip2long ($ ip ));
@@ -159,38 +158,32 @@ public function find($ip)
159158 $ seek = $ this ->meta ['networks ' ]['offset ' ]+($ start *$ this ->meta ['networks ' ]['len ' ]);
160159 fseek ($ this ->db ,$ seek );
161160 $ blocks = fread ($ this ->db ,$ blockCount *$ this ->meta ['networks ' ]['len ' ]);
162- $ blocksLength = strlen ($ blocks );
163- $ offset = 0 ;
164- if ($ blockCount > 10 ) {
165- $ step = ceil (sqrt ($ blockCount ));
166- $ check = substr ($ blocks , $ offset + ($ this ->meta ['networks ' ]['len ' ] * $ step ), 4 );
167- while ($ check && $ long >= $ check && ($ offset < ($ blockCount ) * $ this ->meta ['networks ' ]['len ' ])) {
168- $ offset += $ this ->meta ['networks ' ]['len ' ] * $ step ;
169- $ check = substr ($ blocks , $ offset + ($ this ->meta ['networks ' ]['len ' ] * $ step ), 4 );
170- }
171- }
161+ $ start = 0 ;
162+ $ stop = $ blockCount ;
172163 do {
173- if ($ offset > $ blocksLength ) {
174- $ offset = $ blocksLength -$ this ->meta ['networks ' ]['len ' ];
175- }
176- $ block = substr ($ blocks ,$ offset ,$ this ->meta ['networks ' ]['len ' ]);
177- $ first = substr ($ block ,0 ,4 );
178- $ next = substr ($ blocks ,$ offset +$ this ->meta ['networks ' ]['len ' ],4 );
179- if ($ first <= $ long && ($ long < $ next || $ next == false )) {
180- $ registers = unpack ($ this ->meta ['networks ' ]['pack ' ],substr ($ block ,4 ));
181- }
182- $ offset += $ this ->meta ['networks ' ]['len ' ];
183- } while ($ offset < strlen ($ blocks ) && !$ registers );
184- if (!$ registers ) {
185- foreach ($ this ->meta ['registers ' ] as $ r =>$ register ) {
186- $ registers [$ r ] = 0 ;
164+ $ center = ($ start + $ stop ) >> 1 ;
165+ $ sc = substr ($ blocks , $ center * $ this ->meta ['networks ' ]['len ' ], 4 );
166+ if ($ sc > $ long ) {
167+ $ stop = $ center ;
168+ } else {
169+ $ start = $ center ;
187170 }
171+ $ blocksCount = $ stop - $ start ;
172+ } while ($ blocksCount >= 2 );
173+ if ($ long > $ stop ) {
174+ $ start = $ stop ;
188175 }
189- if (!$ next ) {
190- $ next = pack ('N ' ,ip2long ('255.255.255.255 ' )+1 );
176+ $ block = substr ($ blocks , $ start * $ this ->meta ['networks ' ]['len ' ], $ this ->meta ['networks ' ]['len ' ]);
177+ $ network = unpack ('Nfirst ' ,substr ($ block ,0 ,4 ));
178+ $ data ['network ' ]['first ' ] = long2ip ($ network ['first ' ]);
179+ $ next = substr ($ blocks ,($ start +1 )*$ this ->meta ['networks ' ]['len ' ],4 );
180+ if ($ next ) {
181+ $ network = unpack ('Nlast ' ,$ next );
182+ $ data ['network ' ]['last ' ] = long2ip ($ network ['last ' ]);
183+ } else {
184+ $ data ['network ' ]['last ' ] = '255.255.255.255 ' ;
191185 }
192- $ network = unpack ('Nfirst/Nlast ' ,$ first .$ next );
193- $ data ['network ' ] = array (long2ip ($ network ['first ' ]),long2ip ($ network ['last ' ]-1 ));
186+ $ registers = unpack ($ this ->meta ['networks ' ]['pack ' ],substr ($ block ,4 ));
194187 foreach ($ registers as $ register =>$ item ) {
195188 $ data ['data ' ][$ register ] = $ this ->getRegisterRecord ($ register ,$ item );
196189 }
0 commit comments