Application of PHP dichotomy in IP address query_PHP tutorial
The database probably stores hundreds of thousands of IP records, and the record set is as follows:
+----------+----------+---- --------+---------+---------+--------+--------+
| ip_begin | ip_end | country_id | prov_id | city_id | isp_id | netbar |
+-----------+-----------+---------- ---+---------+---------+--------+--------+
| 0 | 16777215 | 2 | 0 | 0 | 0 |
| 16777216 | 33554431 | 2 | 0 | 0 |
| 33554432 | 50331647 | 2 | 0 | 0 | 0 | 0 |
| 50331648 | 67108863 | 3 | 0 | 0 | 0 |
| 67108864 | 67829759 | 3 | 0 | 0 0 | 0 |
+----------+--- -------+------------+---------+---------+--------+ --------+
To do this query, you need to use the following SQL:
$sql = 'SELECT * FROM i_m_ip WHERE ip_begin <= $client_ip AND ip_end > = $client_ip';
?>
Such a retrieval obviously does not use an index. Even if it is used, the MySQL query efficiency is unlikely to reach more than 500 times per second. I have done a lot of concurrency optimization, and finally the average The query efficiency is only about 200 times per second, which is really a headache. At the beginning, I also thought of using the retrieval method of the Innocence IP library, but I have always been resistant to the algorithm and thought that the dichotomy method was difficult, so I did not try to use it. It was not until I had no choice in the end that I finally realized the dichotomy IP address retrieval method. .
From the above table, you can see that the IP library is a continuous value from 0 to 4294967295. If this value is separated and stored, there will be hundreds of gigabytes of data, so there is no way to use indexes and no way to hash. In the end, I used PHP to convert these things into binary storage, abandoning database retrieval. You can see that the starting and ending length of the IP is a 4-byte long integer. The following country ID, province ID, etc. can be stored using a 2-byte short integer. A total of one row of data has 18 bytes, a total of 31 Ten thousand pieces of data only add up to 5M.The specific IP library generation code is as follows:
/*
IP file format:
3741319168 3758096383 182 0 0 0 0
3758096384 377487359 9 3 0 0 0 0
3774873600 4026531839 182 0 0 0
4026531840 4278190079 182 0 0 0
4294967040 42949672 95 312 0 0 0 0
*/
set_time_limit(0);
$handle = fopen('./ ip.txt', 'rb');
$fp = fopen("./ip.dat", 'ab');
if ($handle) {
while (!feof($handle )) {
$buffer = fgets($handle);
$buffer = trim($buffer);
$buffer = explode("t", $buffer);
foreach ($buffer as $key => $value) {
$buffer[$key] = (float) trim($value);
$str = pack('L', $buffer[0] );
$str .= pack('L', $buffer[1]);
$str .= pack('S', $buffer[2]);
$str .= pack ('S', $buffer[3]);
$str .= pack('S', $buffer[4]);
$str .= pack('S', $buffer[5] );
$str .= pack('S', $buffer[6]);
fwrite($fp, $str);
}
}
?>
In this way, the IPs are arranged in units of 18 bytes in order, so it is easy to use the binary method to retrieve the IP information:
function getip($ip, $fp) {
fseek($ fp, 0);
$begin = 0;
$end = filesize('./ip.dat');
$begin_ip = implode('', unpack('L', fread($ fp, 4)));
fseek($fp, $end - 14);
$end_ip = implode('', unpack('L', fread($fp, 4)));
$begin_ip = sprintf('%u', $begin_ip);
$end_ip = sprintf('%u', $end_ip);
do {
if ($end - $begin <= 18) {
fread($fp, 2)));
$info[1] = implode('', unpack('S', fread($fp, 2)));
$info[2] = implode ('', unpack('S', fread($fp, 2)));
$info[3] = implode('', unpack('S', fread($fp, 2)));
$info[4] implode('', unpack('S', fread($fp, 2)));
$middle_seek = ceil((($end - $begin) / 18) / 2) * 18 + $begin;
fseek($fp, $middle_seek);
$ middle_ip = implode('', unpack('L', fread($fp, 4)));
$middle_ip = sprintf('%u', $middle_ip);
if ($ip >= $middle_ip) {
(true);
}
The above $fp is the file handle to open ip.dat. Since it is a loop retrieval, it is written outside the function to avoid opening the file once for each retrieval. The 30W row data dichotomy only needs to be looped 7 times at most ( You can find accurate IP information in about 2^7). Later, I originally wanted to put ip.dat in the memory to speed up the retrieval. Later I found that the efficiency of the string positioning function was not at the same order of magnitude as the offset positioning of the file pointer, so I gave up using memory to store the IP library.
This implementation has improved the IP retrieval efficiency by nearly a hundred times. It is just a simple application of the dichotomy. From then on, the concept that the algorithm is not important in WEB applications has been completely dispelled. In fact, to achieve this, I also asked Jinhu for advice. I initially asked him to help me generate an IP library in a pure format, and then use Discuz’s IP query function to search for it. However, he refused to help me, and finally created my This practice and learning. Sometimes, it is better to ask for others than to ask for yourself.
http://www.bkjia.com/PHPjc/319312.html
www.bkjia.com

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics











PHP is mainly procedural programming, but also supports object-oriented programming (OOP); Python supports a variety of paradigms, including OOP, functional and procedural programming. PHP is suitable for web development, and Python is suitable for a variety of applications such as data analysis and machine learning.

PHP is suitable for web development and rapid prototyping, and Python is suitable for data science and machine learning. 1.PHP is used for dynamic web development, with simple syntax and suitable for rapid development. 2. Python has concise syntax, is suitable for multiple fields, and has a strong library ecosystem.

PHP originated in 1994 and was developed by RasmusLerdorf. It was originally used to track website visitors and gradually evolved into a server-side scripting language and was widely used in web development. Python was developed by Guidovan Rossum in the late 1980s and was first released in 1991. It emphasizes code readability and simplicity, and is suitable for scientific computing, data analysis and other fields.

PHPhassignificantlyimpactedwebdevelopmentandextendsbeyondit.1)ItpowersmajorplatformslikeWordPressandexcelsindatabaseinteractions.2)PHP'sadaptabilityallowsittoscaleforlargeapplicationsusingframeworkslikeLaravel.3)Beyondweb,PHPisusedincommand-linescrip

PHP is suitable for web development and content management systems, and Python is suitable for data science, machine learning and automation scripts. 1.PHP performs well in building fast and scalable websites and applications and is commonly used in CMS such as WordPress. 2. Python has performed outstandingly in the fields of data science and machine learning, with rich libraries such as NumPy and TensorFlow.

What’s still popular is the ease of use, flexibility and a strong ecosystem. 1) Ease of use and simple syntax make it the first choice for beginners. 2) Closely integrated with web development, excellent interaction with HTTP requests and database. 3) The huge ecosystem provides a wealth of tools and libraries. 4) Active community and open source nature adapts them to new needs and technology trends.

Oracle is not only a database company, but also a leader in cloud computing and ERP systems. 1. Oracle provides comprehensive solutions from database to cloud services and ERP systems. 2. OracleCloud challenges AWS and Azure, providing IaaS, PaaS and SaaS services. 3. Oracle's ERP systems such as E-BusinessSuite and FusionApplications help enterprises optimize operations.

MySQL efficiently manages structured data through table structure and SQL query, and implements inter-table relationships through foreign keys. 1. Define the data format and type when creating a table. 2. Use foreign keys to establish relationships between tables. 3. Improve performance through indexing and query optimization. 4. Regularly backup and monitor databases to ensure data security and performance optimization.
