php 使用 GeoIP 扩展获取 ip 各种信息

项目背景


公司 App 上准备针对客户的ip来推荐最优服务器来快连设备,目前有4个节点,北京、俄勒冈、新加坡、法兰克福。客户端上报 IP,云端根据分配规则返回 server 代号。

资料搜集


一开始打算找第三方的一些API,测试了很多ip定位接口,效果并不好,有的收费,有的需要申请key有调用次数限制,大部分API只有国家和城市的信息,而且不规范,不是国家代码,抓取到结果还需要进一步匹配,因为没有大洲信息,还要自己根据国家去 mapping 大洲。

上面的各种缺点,直接放弃第三方的API,于是找到了 GeoIP 这个扩展,这个有纯PHP版本的,但是我没找到如何获取大洲,直接上C扩展版的,性能肯定没问题,装好扩展,geoip_continent_code_by_name 直接获取大洲简称代码。

php 扩展安装


我的是 Docker 环境 Ubuntu14.04 php5.6, 下面是扩展的安装命令。

apt-get -y --force-yes install php5.6-geoip

注意:--no-install-recommends 这个参数一定不要加,有这个的话安装完成会把 IP 数据包删除的, 我 build docker 镜像的时候吃过亏了,下面是 IP 数据包的目录。

root@1e1931746c6c:/usr/share/GeoIP# ls
GeoIP.dat  GeoIPv6.dat

GeoIP 扩展源码下载: https://pecl.php.net/package/geoip
以下是源码安装步骤:

$ wget https://pecl.php.net/get/geoip-1.1.1.tgz
$ cd geoip-1.1.1
$ phpize
$ ./configure
$ make
$ sudo make install

编写代码


在 phpinfo 能看到 GeoIP,就说明扩展安装好了。
这是 GeoIP 扩展的文档,一个函数获取想要的信息,完全满足了我的需求,比第三方 API 好用的多,直接省去网络请求。
http://php.net/manual/zh/book.geoip.php

Typecho 首页静态化脚本

  哈喽大家好,捣鼓了下博客的优化,把博客主页生成静态文件html了,没有侵入主程序,完全不用担心升级问题,下面分享一下代码。

  1. 在站点根目录下创建或上传 build_index.php,访问这个文件就可以在根目录生成静态文件了。
  2. 更新缓存 http://test.com/build_index.php?password=123456可以在脚本里面设置你的密码,防止被他人利用发起CC攻击,频繁写文件造成服务器IO过高。
  3. 如果不想使用过期更新,可以从脚本里面去掉调用更新那句 script 代码,缓存过期时间修改 $expire 变量。
  4. 另外需要注意的是你的 index.html 要在 index.php 前面,否则不生效。Apache 修改 DirectoryIndex, Nginx 修改 index,IIS 配置默认文档。
<?php
/**
 * 首页静态化脚本
 * Author: Yusure
 * Blog: yusure.cn
 */
ini_set( 'date.timezone', 'PRC' );

/* 缓存过期时间 单位:秒 */
$expire = 86400;
/* 主动刷新密码  格式:http://test.com/build_index.php?password=123456 */
$password = '123456';
$file_time = @filemtime( 'index.html' );
time() - $file_time > $expire && create_index();
isset( $_GET['password'] ) && $_GET['password'] == $password && create_index();

/**
 * 生成 index.html
 */
function create_index()
{
    ob_start();
    include( 'index.php' );
    $content = ob_get_contents();
    $content .= "\n<!-- Create time: " . date( 'Y-m-d H:i:s' ) . " -->";
    /* 调用更新 */
    $content .= "\n<script language=javascript src='build_index.php'></script>";
    ob_clean();
    $res = file_put_contents( 'index.html', $content );
    if ( $res !== false )
    {
        die( 'Create successful' );
    }
    else
    {
        die( 'Create error' );
    }
}

GitHub下载地址:https://gist.github.com/yusureabc/34564707391b6275864b94b3cdc0088f

配置php的session存储到memcache或redis

  PHP默认配置是将session以文件形式存储在服务器上,网站访问量增加之后,单机的io是瓶颈,而且文本读取慢,除了默认的文本还可以存放到数据库,放到内存(memcache,redis)。不建议放到数据库里面,还是配置到内存里面比较爽,既提高了访问速度,又很好的实现了会话共享。

memcache 存储

如何配置

服务端配置很简单只要两条配置命令

  1. 在 php.ini 中全局设置
    session.save_handler = memcache
    session.save_path = "tcp://127.0.0.1:11211"
  2. 单一网站配置(在php入口处添加,用框架的项目只需要在配置文件里面修改就可以了)
    ini_set("session.save_handler", "memcache");
    ini_set("session.save_path", "tcp://192.168.48.128:11211");
如何与网站应用互通

memcached 服务是没有密码的,如果没有限制的暴露在外网,任何用户都是可以连接的。
-l 是监听的服务器IP地址,默认是127.0.0.1,任何ip访问0.0.0.0

- 阅读全文 -

PHP查看对象中的所有方法名

  一个类有很多方法,有时候拿不准用哪个方法去处理,可以全部打印出来,一个类都什么方法,一目了然。

<?php
class a
{
    public $a = 1;
    public function __construct() { }
    public function aaa()
    {
        echo "a";
    }
    public function get_name() { }
}
$a = new a();
var_dump( get_class_methods( $a ) );

打印结果:

0 => string '__construct' (length=11)
1 => string 'aaa' (length=3)
2 => string 'get_name' (length=8)

wamp 3.0.6(apache 2.4.23) 配置多站点

     之前开发机器上一直用着wamp2.2,php5.4.3也有点落后了,composer更新很多类都提示要升级php版本了,于是就下载了wampserver3.0.6,软件包200多M。apache2.4.23_mysql5.7.14_php5.6.25-7.0.10。安装之后php5.6,php7.0随意切换。有些项目是mysql的,还是乖乖用5.6吧,毕竟php7没有mysql驱动,可以用mysqli,pdo_mysql。推荐用PDO来操作数据库。

    注意:vc++ 2015要安装,没有的话apache跑不了。

    装完wamp3就要配置多站点了,apache2.4是要将其中的 Require local 修改成 Require all granted

blob.png

    因为我之前的是wamp2.2,很多项目还在之前的旧的目录,所以在apache2.4下授权旧的目录,这样就可以把原来的配置文件复制过来用了,目录授权之后DocumentRoot配置的路径也不用动。在httpd.conf里面属于全局配置,也可以在httpd-vhosts.conf里面单独配置。

blob.png

    最后重启apache。