分享一个自用的IP更新PHP小代码,有需要的可以拿去!

01.png

因为家里有公网IP(随机的公网IP),有时候需要知道IP连进去,原来都是让媳妇用手机打开度娘搜“本机IP”之类的方式然后直接截图告诉我;女生嘛,嫌麻烦;又学不会,想着拉到吧自己写一个PHP代码用内网服务器挂个定时任务,1分钟执行一次,完事!于是乎你们就看到了如下代码:

完整代码

<?php
// 配置相关,一般只需要改这个
$config = [
    // 可以更新IP的密钥,支持GET/POST方式传入
    "updateToken" => "605d5a3a8d55ca36f394b01734177bb5",
    // 本地IP缓存记录
    "tempData" => __DIR__ . "/tempData.json",
    // 自定义响应头
    "responseHeader" => [
        // 跨域配置
        "Access-Control-Allow-Origin:*",
        "Access-Control-Allow-Headers:*",
        "Access-Control-Allow-Methods:GET,POST",
        // 返回json数据
        "Content-Type:application/json; charset=utf-8",
    ],
    // token字段?默认:token
    "tokenField" => "token"
];

// 获取请求参数
$get = $_GET;
$post = $_POST;
$data = array_merge($get, $post);

// 如果参数中有token字段
$debug = $config["debug"];
$tokenField = $config["tokenField"];
$tempData = $config["tempData"];
$allowCors = $config["allowCors"];
$updateToken = $config["updateToken"];
$responseHeader = $config["responseHeader"];

// 自定义响应头
foreach ($responseHeader as $rule) {
    header($rule);
}

// 内置函数
class Util
{
    /**
     * 返回JSON信息
     * @param $code
     * @param null $msg
     * @param null $data
     */
    public static function returnJson($code, $msg = null, $data = null)
    {
        header("Content-Type:application/json; charset=utf-8");
        $result = ["code" => $code];
        if (!is_null($msg)) $result["msg"] = $msg;
        if (!is_null($data)) $result["data"] = $data;
        echo json_encode($result);
        exit();
    }

    /**
     * 获取真实IP
     * @return array|false|mixed|string
     */
    public static function getIp()
    {
        if (isset($_SERVER)) {
            if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])) {
                $ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
            } else if (isset($_SERVER["HTTP_CLIENT_IP"])) {
                $ip = $_SERVER["HTTP_CLIENT_IP"];
            } else {
                $ip = $_SERVER["REMOTE_ADDR"];
            }
        } else {
            if (getenv("HTTP_X_FORWARDED_FOR")) {
                $ip = getenv("HTTP_X_FORWARDED_FOR");
            } else if (getenv("HTTP_CLIENT_IP")) {
                $ip = getenv("HTTP_CLIENT_IP");
            } else {
                $ip = getenv("REMOTE_ADDR");
            }
        }
        return $ip;
    }
}

// 业务逻辑
if (isset($data[$tokenField])) {
    // 如果有token字段,则表示更新IP,反之为取IP
    $token = $data[$tokenField];
    // 如果token等于配置token
    if ($token === $updateToken) {
        $data = ["ip" => Util::getIp(), "update_time" => date("Y-m-d H:i:s")];
        file_put_contents($tempData, json_encode($data));
        Util::returnJson(200, "更新IP成功!", $data);
    } else {
        Util::returnJson(401, "您没有权限更新IP地址!");
    }
} else {
    // 取IP
    if (file_exists($tempData)) {
        $result = json_decode(file_get_contents($tempData));
        Util::returnJson(200, "获取数据成功", $result);
    } else {
        Util::returnJson(500, "暂未同步过IP地址,请稍后再试!");
    }
}

如何使用

1、首先确保你有PHP环境,且环境正常,至于PHP版本具体我没测,反正我自己用测到5.6是没问题的;
2、复制上方代码,粘贴并保存到站点,如:index.php
3、访问站点,即可获取最新IP,如需更新IP,可通过get或post请求传入密钥更新

备注

以下举例仅适用于你把文件保存到站点根目录,且文件名是 index.php,且默认文档顺序 index.php 是第一位;

返回报文预览

场景1:没更新过IP

{
  "code": 500,
  "msg": "暂未同步过IP地址,请稍后再试!"
}

场景2:更新IP

{
  "code": 200,
  "msg": "更新IP成功!",
  "data": {
    "ip": "117.64.227.226",
    "update_time": "2022-01-16 23:30:08"
  }
}

场景3:查看IP

{
  "code": 200,
  "msg": "获取数据成功",
  "data": {
    "ip": "117.64.227.226",
    "update_time": "2022-01-16 23:30:08"
  }
}