@@ -84,7 +84,7 @@ public function __construct($databaseFile)
84
84
'dit ' => $ dit ,
85
85
'version ' => $ tmp ['ver ' ],
86
86
];
87
- if ($ this ->meta ['version ' ] !== self ::VERSION ) {
87
+ if ($ this ->meta ['version ' ] != self ::VERSION ) {
88
88
fclose ($ this ->db );
89
89
$ this ->errors [] = 'file ' .$ databaseFile .' is not database version ' .self ::VERSION ;
90
90
return ;
@@ -137,7 +137,6 @@ public function find($ip)
137
137
{
138
138
if (!filter_var ($ ip , FILTER_VALIDATE_IP )) return false ;
139
139
if (!$ this ->isCorrect ) return false ;
140
- $ registers = false ;
141
140
$ data = array ();
142
141
$ octet = (int )$ ip ;
143
142
$ long = pack ('N ' ,ip2long ($ ip ));
@@ -159,38 +158,32 @@ public function find($ip)
159
158
$ seek = $ this ->meta ['networks ' ]['offset ' ]+($ start *$ this ->meta ['networks ' ]['len ' ]);
160
159
fseek ($ this ->db ,$ seek );
161
160
$ 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 ;
172
163
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 ;
187
170
}
171
+ $ blocksCount = $ stop - $ start ;
172
+ } while ($ blocksCount >= 2 );
173
+ if ($ long > $ stop ) {
174
+ $ start = $ stop ;
188
175
}
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 ' ;
191
185
}
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 ));
194
187
foreach ($ registers as $ register =>$ item ) {
195
188
$ data ['data ' ][$ register ] = $ this ->getRegisterRecord ($ register ,$ item );
196
189
}
0 commit comments