首页 > 语言 > 关键词 > discuz最新资讯 > 正文

DISCUZ架构:misc.func.php文件分析一

2008-10-24 19:08 · 稿源:php118.com
以下为引用的内容:
/**
* 这个函数看着很长,其实要实现的功能很少,就是通过ip地址返回一个对应的地理位置
* @para string $ip //给定的ip,要符合点分十进制
*
* @return string
*/
function convertip($ip) {
        if(!preg_match("/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/", $ip)) {
                return '';
        }

        if($fd = @fopen(DISCUZ_ROOT.'./ipdata/wry.dat', 'rb')) {

                $ip = explode('.', $ip);
                $ipNum = $ip[0] * 16777216 + $ip[1] * 65536 + $ip[2] * 256 + $ip[3];

                $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;

                while($ip1num > $ipNum || $ip2num < $ipNum) {
                        $Middle= intval(($EndNum + $BeginNum) / 2);

                        fseek($fd, $ipbegin + 7 * $Middle);
                        $ipData1 = fread($fd, 4);
                        if(strlen($ipData1) < 4) {
                                fclose($fd);
                                return '- System Error';
                        }
                        $ip1num = implode('', unpack('L', $ipData1));
                        if($ip1num < 0) $ip1num += pow(2, 32);

                        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 == 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;
                }
                fclose($fd);

                if(preg_match('/http/i', $ipAddr2)) {
                        $ipAddr2 = '';
                }
                $ipaddr = "$ipAddr1 $ipAddr2";
                $ipaddr = preg_replace('/CZ88\.NET/is', '', $ipaddr);
                $ipaddr = preg_replace('/^\s*/is', '', $ipaddr);
                $ipaddr = preg_replace('/\s*$/is', '', $ipaddr);
                if(preg_match('/http/i', $ipaddr) || $ipaddr == '') {
                        $ipaddr = '- Unknown';
                }

                return '- '.$ipaddr;

        } else {

                $datadir = DISCUZ_ROOT.'./ipdata/';
                $ip_detail = explode('.', $ip);
                if(file_exists($datadir.$ip_detail[0].'.txt')) {
                        $ip_fdata = @fopen($datadir.$ip_detail[0].'.txt', 'r');
                } else {
                        if(!($ip_fdata = @fopen($datadir.'0.txt', 'r'))) {
                                return '- Invalid IP data file';
                        }
                }
                for($i = 0; $i <= 3; $i++) {
                        $ip_detail[$i] = sprintf('%03d', $ip_detail[$i]);
                }
                $ip = join('.', $ip_detail);
                do {
                        $ip_data = fgets($ip_fdata, 200);
                        $ip_data_detail = explode('|', $ip_data);
                        if($ip >= $ip_data_detail[0] && $ip <= $ip_data_detail[1]) {
                                fclose($ip_fdata);
                                return '- '.$ip_data_detail[2].$ip_data_detail[3];
                        }
                } while(!feof($ip_fdata));
                fclose($ip_fdata);
                return '- UNKNOWN';

        }

}

  • 相关推荐
  • 大家在看
  • 用php源码搭建二维码加密支付平台

    今天给大家介绍的项目-"用php源码搭建二维码加密支付平台",可以说,有一定的技术门槛,有一定的壁垒,因为需要搭建网站并且运营。正是因为有一定的门槛,需要学习和准备一些东西,才能挡住大多数用户的进入,才能长久的赚取利润。这些技术门槛,和需要准备的一些东西,我今天会详细的,手把手的教大家,如果你肯学习,并且有一定的网络基础,我相信可以很快突破难点,搭建成功。一旦搭建成功,运用一些推广的手段,后期

  • “DiDi说泵”推广价格预估,靠谱的自媒体推广平台

    备注:本文数据来自站长之家移动传媒平台,文章涉及的数据依托平台大数据计算所得,非百度官方数据,仅供参考。DiDi说泵是当前百家号中的普通号,目前账号百家号权重为0,综合排名位列1049940名,社会分类排名位列139040名,领先了6.0%的百家号。 DiDi说泵百家号概况 DiDi说泵的简介为八年工业泵实战经验帮你水泵选型!,是一家主旨明确、领域专注的自媒体作者,截止目前为止他们已经在百家号上发布了超过0篇的游戏内容,最近该作?

  • AMD/Intel/NVIDIA竞争惨烈:供应链懵了

    AMD、Intel、NVIDIA,作为CPU/GPU芯片行业的三大上游巨头,一举一动都对整个产业有着巨大的影响,而现在,似乎整个产业链都被三家的产品发布节奏给整懵了。产业链人士认为,三家巨头的新品发布

  • LG Display已被韩国选定为可伸缩显示屏研发领导厂商

    6月12日消息,据国外媒体报道,LG旗下专注于面板事务的LG Display,已被韩国选定为可伸缩显示屏研发的领导厂商。LG Display被韩国选定为可伸缩显示屏研发的领导厂商的消息,是LG Display在官网宣布的。官网的信息显示,LG Display已被韩国产业通商资源部(MOTIE),选定为可伸缩显示屏研发这一国家项目的领导厂商。LG Display在官网上表示,他们会监督这一大型研发项目的进展,可伸缩显示屏研发项目,是韩国产业通商资源

  • RTX 3080系列显卡泄密严重 NVIDIA开始调查了

    虽然5月份的GTC 2020演讲中,NVIDIA已经正式发布了7nm工艺的安培GPU,但首发的A100是面向数据中心市场的,安培游戏卡的还是个谜。最近一周RTX 3000系列显卡的爆料很多,NVIDIA已经开始调查代工厂

  • 显示行业年度盛会——DIC EXPO显示展招展进入倒计时

    所有的成绩,都是实力的最好背书;所有品质,也需要用成绩来佐证。由权威协会中国光学光电子行业协会液晶分会CODA唯一主办 2020 中国(上海)国际显示技术及应用创新展(简称DIC EXPO显示展)凭借自身的专业、权威、高品质、高规格、大规模,成为全球显示行业年度盛会,自进入公众视野以来关注度始终居高不下,吸引了显示产业链上的企业争相加入,现展位即将售罄。作为疫后全球显示展会的先锋,DIC EXPO显示展将于 7 月22- 24 日上

  • AMD将改写10年来DIY市场历史:份额逼近30% 大厂全齐了

    AMD去年7月推出的7nm锐龙3000处理器一直卖的不错,下个月应该会推出改良版的锐龙3000XT系列处理器,有望再添一把火。AMD在DIY市场上稳步推进,有可能改写10年来的历史,市场份额逼近30%。根据

  • NVIDIA、奔驰重新定义自动驾驶:终生都可随时升级

    6月23日,NVIDIA、梅赛德斯-奔驰联合宣布,将共同打造革命性的车载计算系统、AI计算基础架构,成为奔驰所有下一代汽车的标准配置,并于2024年起在奔驰下代车型中率先实现可升级的自动驾驶功能。

  • Dior低调入驻天猫 开出官方唯一天猫旗舰店

    今天,奢侈品牌Dior低调入驻天猫,开出首家官方旗舰店。旗舰店首页上显示,诸多品牌即将在 7 月底盛大开幕。Dior 的明星产品 Miss Dior 香水系列、烈艳蓝金唇膏都在该店首屏推广之列。Dior 还强调了自身是 “官方唯一天猫旗舰店”和 “100% 的官方正品保证”。

  • 梅赛德斯(Mercedes)和英伟达(Nvidia)合作建立强大的计算平台

    [TechWeb]梅赛德斯·奔驰(Mercedes-Benz)与英伟达(Nvidia)合作开发用于汽车的下一代计算平台,该平台将支持从空中软件更新到自动驾驶的所有内容。这家德国汽车制造商表示计划从2024年开始在其车队中推广这项新技术。新平台将基于Nvidia的片上系统Orin技术,还将使用基于San Jose的公司完整的Drive AGX软件堆栈。Nvidia 于2019年12月在CES上首次展示了Orin ,除了顶级规格(例如每秒可以进行200万亿次运算,同时使用更少的功率

  • Dior近期低调入驻天猫店 店铺已有1.2万粉丝关注

    近期,Dior低调入驻天猫开店,旗下明星产品Miss Dior香水系列、烈艳蓝金唇膏均在该店首屏推广之列。同时,Dior还强调了自身是“官方唯一天猫旗舰店”和“100%的官方正品保证”。在没有做任何宣传的情况下,店铺已经有 12000 多位粉丝关注。

  • 想要享受黑科技带来的数字生活?来DIGIX数字生活实验室就对了

    再遇鹏城,探索超感知数字生活,6月18日-6月22日,华为DIGIX数字生活实验室来到了深圳卓悦中心,别具一格的潮酷黑科技给深圳市民带来了智慧生活的体验。DIGIX数字生活实验室内华为终端云服务各大应用的沉浸式体验专区可谓人气爆棚,花币卡、专属明信片、可爱抱枕等专属礼品也让参与体验者满载而归,夏日炎炎,快来有颜值、又潮酷的DIGIX数字生活实验室玩耍吧。DIGIX数字生活实验室现场在华为DIGIX数字生活实验室中,打卡体验之旅必

  • NVIDIA严查没用:RTX 3080偷跑更进一步

    围绕RTX 3080的爆料突然多了起来,据说NVIDIA已经开始严查泄密事件,富士康、比亚迪等装配厂都在列。不过,RTX 3080是否就是别致的双面对吹风扇造型,似乎还没定论,有消息称,NVIDIA中层经理

  • 抄袭起家却混得风生水起,扒一扒“美版贴吧”Reddit早期成长史

    从 2005 年上线至今,Reddit已经发展成全球最具影响力的社交平台之一。目前,这个平台月活用户已经达到4. 3 亿,平台拥有超过一百万个版块,覆盖范围非常广阔。

  • DIGIX数字生活实验室来袭,教你玩转华为会员中心

    近日,DIGIX数字生活实验室快闪店在深圳卓越中心开幕,在为期五天的活动里,华为会员中心专区为用户们展示了华为会员中心APP的系列玩法,为大家带来有趣的感官体验和满满的科技时尚感。本次活动中,华为会员中心活动区通过多感官交互体验,让大家了解了华为会员中心APP的各种功能,包括社区交流、权益领取、资讯浏览、活动参与等等;现场还设计了趣味小游戏,大家纷纷参与互和抽奖,获奖的用户可以在华为生活馆内兑换精美小礼品和花

  • 捷信四川团队启动ALDI2.0自助办单流程科技化获商户好评

    2019年,金融科技行业发生深刻变革,都在使用金融科技探索新的商机。未来,金融科技将实现健康化、规范化发展,开启新一轮的技术创新和应用实践。今年4月,捷信消费金融有限公司(以下简称“捷信”)在四川宜宾正式展开ALDI2.0模式的试点工作,让更多商户体验到了科技转型带给切实体验的便捷服务,捷信在助力合作中小微商户完美融入“线下+线上”新零售闭环之余,也为消费者在更多细分场景下享受优质消费信贷服务创造了新的路径。?

  • 印度唱片公司Saregama India宣布已与Facebook达成一项全球许可协议

    DoNews 6月3日消息(记者 程梦玲)北京时间3日消息,印度最大唱片公司之一Saregama India周三宣布,已与美国社交媒体巨头Facebook达成一项全球许可协议,将允许用户从其大量宝莱坞音乐目录中选择乐曲,用于他们的Facebook和Instagram帖子。受此消息推动,Saregama股价周三盘中一度暴涨20%,触及涨停。此项交易的财务条款未予透露。Saregama称,Facebook和Instagram用户现在可以在他们的帖子和“故事”中添加来自其超过10万首跨越25

  • AMD GPU七年累计出货5.53亿颗:一优势让Intel/NVIDIA羡慕不已

    市调机构Jon Peddie Research今天发布了一组有趣的数据,显示了AMD 2013-2019年八年间GPU图形处理器的出货量,包括独立显卡、消费级APU、游戏机APU三大类。数据显示,AMD GPU 2013年的出货量仅

  • 智能变革:英特尔HPC高性能计算与AI人工智能解决方案和实例

    在竞争日益激烈的环境中,数据中心作为传统信息化的基础,伴随着全面AI时代与5G、物联网的不断临近,企业希望获得出色的模拟和建模、人工智能(AI)和大数据分析功能,以便取得突破性的发现与创新,而高性能计算(HPC)基础设施能够为这些工作负载带来优势。 企业如果想在相同的 HPC 基础设施中运行 HPC、大数据分析和 AI 工作负载,优化的资源调度降低计算成本需要一个全面的融合HPC和AI集群的解决方案。 英特尔? 精选解决方案基于英

  • 现在买iPhone 11还是等iPhone 12?李楠:等iP12

    一年一度的618将于今晚0点正式开启。6月17日消息,一位知友在知乎提问:现在买iPhone 11还是等iPhone 12?目前iPhone 11在各大平台有大幅降价,京东平台iPhone 11 64GB版到手价4599元,拼多

  • 参与评论
文明上网理性发言,请遵守新闻评论服务协议

热文

  • 3 天
  • 7天