//根据ip获取地址信息
composer require "mylukin/ip2city: dev-master"

// vendor/mylukin/ip2city/src/IP2City.php 修改为下面这些内容
<?php
/**
* Created by PhpStorm.
* User: lukin
* Date: 15/3/26
* Time: 15:56
*/ namespace MyLukin\IP2City; class IP2City
{ private static $ip = NULL;
private static $fp = NULL;
private static $offset = NULL;
private static $index = NULL;
private static $cached = array();
private static $datFile = '17monipdb.dat'; // IP17Mon instance
private static $instance; /**
* Returns IP2City instance.
*
* @static
* @param string $dat_file
* @return Mylukin\Ip2city\IP2City
*/
public static function &instance($dat_file)
{
if (!self::$instance) {
self::$instance = new static($dat_file);
}
return self::$instance;
} public function __construct($dat_file)
{
self::$datFile = trim(getcwd(),'public').'/vendor/mylukin/ip2city/'.$dat_file;
} public static function ip2addr($ip)
{
if (empty($ip) === TRUE) {
return 'N/A';
} $nip = gethostbyname($ip);
$ipdot = explode('.', $nip); if ($ipdot[0] < 0 || $ipdot[0] > 255 || count($ipdot) !== 4) {
return 'N/A';
} if (isset(self::$cached[$nip]) === TRUE) {
return self::$cached[$nip];
} if (self::$fp === NULL) {
self::init();
} $nip2 = pack('N', ip2long($nip)); $tmp_offset = (int)$ipdot[0] * 4;
$start = unpack('Vlen', self::$index[$tmp_offset] . self::$index[$tmp_offset + 1] . self::$index[$tmp_offset + 2] . self::$index[$tmp_offset + 3]); $index_offset = $index_length = NULL;
$max_comp_len = self::$offset['len'] - 1024 - 4;
for ($start = $start['len'] * 8 + 1024; $start < $max_comp_len; $start += 8) {
if (self::$index{$start} . self::$index{$start + 1} . self::$index{$start + 2} . self::$index{$start + 3} >= $nip2) {
$index_offset = unpack('Vlen', self::$index{$start + 4} . self::$index{$start + 5} . self::$index{$start + 6} . "\x0");
$index_length = unpack('Clen', self::$index{$start + 7}); break;
}
} if ($index_offset === NULL) {
return 'N/A';
} fseek(self::$fp, self::$offset['len'] + $index_offset['len'] - 1024); self::$cached[$nip] = explode("\t", fread(self::$fp, $index_length['len'])); return self::$cached[$nip];
} private static function init()
{
if (self::$fp === NULL) {
self::$ip = new self(self::$datFile); self::$fp = fopen(self::$datFile, 'rb');
if (self::$fp === FALSE) {
throw new Exception('Invalid 17monipdb.dat file!');
} self::$offset = unpack('Nlen', fread(self::$fp, 4));
if (self::$offset['len'] < 4) {
throw new Exception('Invalid 17monipdb.dat file!');
} self::$index = fread(self::$fp, self::$offset['len'] - 4);
}
} public function __destruct()
{
if (self::$fp !== NULL) {
fclose(self::$fp);
}
}
}

composer ip2city配置的更多相关文章

  1. windows下手动安装composer并配置环境变量

    windows下手动安装composer并配置环境变量   转载地址: https://my.oschina.net/7sites/blog/209997 之前发表过一篇如何为composer设置代理 ...

  2. Ubuntu下安装composer及配置

    1.下载最新composer wget -c https://getcomposer.org/composer.phar 2.可执行权限 chmod u+x composer.phar 3.放置到安装 ...

  3. PHPUnit使用教程——PHP环境变量+x-debug+composer+phpunit配置安装(超详细!)

    注意:Windows系统 一.提前入坑点:要求php5.6,7.0,7.1,不论使用集成版还是非集成版的小伙伴都要好好查看自己的php版本,个人的版本居然是5.5.X的,哭唧唧.不过别担心,爸爸教你升 ...

  4. liunx系统安装composer与配置

    1.下载composer curl -sS https://getcomposer.org/installer | php 2.我把它放在系统的PATH目录中,这样就能在全局访问它. mv compo ...

  5. composer.json 配置设置

    配置文件的值为 key:val 必须双引号包裹 一.配置文件 名字 name包名称由用户名名称和仓库名称组成包版本限制来请求Monolog软件包 1.0.*.这意味着1.0开发分支中的任何版本,或大于 ...

  6. composer环境配置

    一 下载composer.phar http://pan.baidu.com/s/1nuDQBzz cmd命令行切换到composer.phar文件目录下 运行: echo @php "%~ ...

  7. composer 无法配置命令行写入配置文件问题

    composer config repo.packagist composer https://packagist.phpcomposer.com 这条命令无法修改composer.json 添加中国 ...

  8. composer 阿里云镜像配置

    https://developer.aliyun.com/composer 全局配置(推荐) 所有项目都会使用该镜像地址: composer config -g repo.packagist comp ...

  9. 基于Composer Player 模型加载和相关属性设置

    主要是基于达索软件Composer Player.的基础上做些二次开发. public class ComposerToolBarSetting { public bool AntiAliasingO ...

随机推荐

  1. Erlang Error Records

    1.No match of right hand value ... Erlang变量名需要以大写开头.

  2. Spark读取配置(转)

    转自:https://github.com/keepsimplefocus/spark-sourcecodes-analysis/blob/master/markdowns/Spark%E8%AF%B ...

  3. SQL SERVER 2000安装遇到的问题小汇总(转载)

    [1]安装程序配置服务器失败需要修改下注册表1 打开注册表 在"开始"--"运行"键入 "regedit"  2 删除注册表如下键值: HK ...

  4. 【386】operator 的 itemgetter、slice、and_、or_

    itemgetter 用来获取数组中指定索引的元素 from operator import itemgetter itemgetter(1, 3, 5)('ABCDEFG') output: ('B ...

  5. [ SHELL编程 ] 数组、关联数组和awk数组

    本文主要对shell编程中常用的数组.关联数组和awk数组定义.操作以及注意事项做个总结,并提供具体案例. 数组 数组定义:一对圆括号表示数组,数组元素之间用空格符号分割. Array=(val1 v ...

  6. RabbitMQ、Memcached、SQLAlchemy

    一.RabbitMQ 1.基础概念 rabbitMQ说白了就是一个消息队列,类似于Queue,也是生产者与消费者模型.只不过做了扩展,所不同的是Queue在内存中的消息队列,而RabbitMQ是部署在 ...

  7. win 2012 安装mysql 5.7.20 及报错 This application requires Visual Studio 2013 Redistributable. Please install the Redistributable then run this installer again 的解决办法

    本文地址:http://www.cnblogs.com/jying/p/7764147.html    转载请注明出处. 安装过程其实挺简单,基本上下一步下一步,可以参考我的另一篇mysql安装文章: ...

  8. MPI Maelstrom-单源最短路-Djsktra

    BIT has recently taken delivery of their new supercomputer, a 32 processor Apollo Odyssey distribute ...

  9. workerman 平滑重启

    <?phpuse Workerman\Worker;use Workerman\Lib\Timer; require_once '../../web/Workerman/Autoloader.p ...

  10. JS----click3种方法

    js最常用的click事件3种方法 1.onclick=name() <!DOCTYPE html> <html leng="en"> <head&g ...