php实现根据ip跳转的方法:首先返回当前ip的城市字符串;然后检查ip地址;接着打开ip数据文件,并分解ip进行运算;最后使用二分查找法从索引记录中搜索匹配的ip记录,并进行相应的替换操作即可。
推荐:《php视频教程》
php代码根据ip判断城市并跳转
代码:
<?php//返回当前ip的城市字符串function convertip($ip) { //ip数据文件路径 $dat_path = 'qqwry.dat'; //检查ip地址 if(!preg_match("/^(\\\\d{1,2}|1\\\\d\\\\d|2[0-4]\\\\d|25[0-5])\\\\.(\\\\d{1,2}|1\\\\d\\\\d|2[0-4]\\\\d|25[0-5])\\\\.(\\\\d{1,2}|1\\\\d\\\\d|2[0-4]\\\\d|25[0-5])\\\\.(\\\\d{1,2}|1\\\\d\\\\d|2[0-4]\\\\d|25[0-5])$/", $ip)) { return 'ip address error'; } //打开ip数据文件 if(!$fd = @fopen($dat_path, 'rb')){ return 'ip date file not exists or access denied'; } //分解ip进行运算,得出整形数 $ip = explode('.', $ip); $ipnum = $ip[0] * 16777216 $ip[1] * 65536 $ip[2] * 256 $ip[3]; //获取ip数据索引开始和结束位置 $databegin = fread($fd, 4); $dataend = fread($fd, 4); $ipbegin = implode('', unpack('l', $databegin)); if($ipbegin < 0) $ipbegin = pow(2, 32); $ipend = implode('', unpack('l', $dataend)); if($ipend < 0) $ipend = pow(2, 32); $ipallnum = ($ipend - $ipbegin) / 7 1; $beginnum = 0; $endnum = $ipallnum; //使用二分查找法从索引记录中搜索匹配的ip记录 while($ip1num>$ipnum || $ip2num<$ipnum) { $middle= intval(($endnum $beginnum) / 2); //偏移指针到索引位置读取4个字节 fseek($fd, $ipbegin 7 * $middle); $ipdata1 = fread($fd, 4); if(strlen($ipdata1) < 4) { fclose($fd); return 'system error'; } //提取出来的数据转换成长整形,如果数据是负数则加上2的32次幂 $ip1num = implode('', unpack('l', $ipdata1)); if($ip1num < 0) $ip1num = pow(2, 32); //提取的长整型数大于我们ip地址则修改结束位置进行下一次循环 if($ip1num > $ipnum) { $endnum = $middle; continue; } //取完上一个索引后取下一个索引 $dataseek = fread($fd, 3); if(strlen($dataseek) < 3) { fclose($fd); return 'system error'; } $dataseek = implode('', unpack('l', $dataseek.chr(0))); fseek($fd, $dataseek); $ipdata2 = fread($fd, 4); if(strlen($ipdata2) < 4) { fclose($fd); return 'system error'; } $ip2num = implode('', unpack('l', $ipdata2)); if($ip2num < 0) $ip2num = pow(2, 32); //没找到提示未知 if($ip2num < $ipnum) { if($middle == $beginnum) { fclose($fd); return 'unknown'; } $beginnum = $middle; } } $ipflag = fread($fd, 1); if($ipflag == chr(1)) { $ipseek = fread($fd, 3); if(strlen($ipseek) < 3) { fclose($fd); return 'system error'; } $ipseek = implode('', unpack('l', $ipseek.chr(0))); fseek($fd, $ipseek); $ipflag = fread($fd, 1); } if($ipflag == chr(2)) { $addrseek = fread($fd, 3); if(strlen($addrseek) < 3) { fclose($fd); return 'system error'; } $ipflag = fread($fd, 1); if($ipflag == chr(2)) { $addrseek2 = fread($fd, 3); if(strlen($addrseek2) < 3) { fclose($fd); return 'system error'; } $addrseek2 = implode('', unpack('l', $addrseek2.chr(0))); fseek($fd, $addrseek2); } else { fseek($fd, -1, seek_cur); } while(($char = fread($fd, 1)) != chr(0)) $ipaddr2 .= $char; $addrseek = implode('', unpack('l', $addrseek.chr(0))); fseek($fd, $addrseek); while(($char = fread($fd, 1)) != chr(0)) $ipaddr1 .= $char; } else { fseek($fd, -1, seek_cur); while(($char = fread($fd, 1)) != chr(0)) $ipaddr1 .= $char; $ipflag = fread($fd, 1); if($ipflag ==
企业级云服务器配置阿里云的服务器怎么租用闲置硬盘搭建外网私有云服务器云服务器和阿里云区别海外云服务器1折优惠国内便宜虚拟主机有哪些?如何选择最便宜虚拟主机如何提升网站SEO页面转化率 必备的4个要素这个新注册域名说是系统故障