负载均衡后,thinkphp5获取用户真实IP地址

在项目中由于使用的是单个服务器,所以代码里获取ip地址都是直接使用框架里自带的方法获取,但是负载均衡之后,获取的ip地址就不对了,每次请求都在变


/**
 * 获取用户真实IP
 * @param int $type
 * @param bool $adv
 * @return mixed
 * @Date: 2021/8/14 11:54
 * @Author wzb
 */
function get_user_ip($type = 0, $adv = true)
{
    $type      = $type ? 1 : 0;
    static $ip = null;
    if (null !== $ip) {
        return $ip[$type];
    }

    if ($adv) {
        if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
            $arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
            $pos = array_search('unknown', $arr);
            if (false !== $pos) {
                unset($arr[$pos]);
            }
            $ip = trim(current($arr));
        } elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
            $ip = $_SERVER['HTTP_CLIENT_IP'];
        } elseif (isset($_SERVER['REMOTE_ADDR'])) {
            $ip = $_SERVER['REMOTE_ADDR'];
        }
    } elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        $arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
        $pos = array_search('unknown', $arr);
        if (false !== $pos) {
            unset($arr[$pos]);
        }
        $ip = trim(current($arr));
    } elseif (isset($_SERVER['REMOTE_ADDR'])) {
        $ip = $_SERVER['REMOTE_ADDR'];
    }
    // IP地址合法验证
    $long = sprintf("%u", ip2long($ip));
    $ip   = $long ? array($ip, $long) : array('0.0.0.0', 0);
    return $ip[$type];
}
要统计用户下单后的消费天数和消费金额,需要进行以下步骤: 1. 获取用户下单时间和订单金额 首先需要从数据库中获取用户下单时间和订单金额,可以使用TP5提供的ORM模型来实现。假设订单表为Order,用户表为User,可以通过以下代码获取用户的订单信息: ``` $order = Order::where('user_id', $user_id)->where('status', 1)->select(); // 遍历订单信息,获取订单时间和金额 foreach ($order as $item) { $order_time = $item->create_time; $order_amount = $item->amount; } ``` 2. 计算消费天数 可以使用PHP的日期时间函数来计算消费天数。假设当前时间为$now_time,可以通过以下代码计算用户下单后的消费天数: ``` $order_date = date('Y-m-d', strtotime($order_time)); $now_date = date('Y-m-d', strtotime($now_time)); $days = (strtotime($now_date) - strtotime($order_date)) / 86400; // 一天的秒数为86400 ``` 3. 计算消费金额 可以对用户的订单金额进行累加,得到用户的消费金额。可以使用PHP的foreach循环来实现。假设$user_amount为用户消费金额的初始值,可以通过以下代码计算用户的消费金额: ``` $user_amount = 0; foreach ($order as $item) { $user_amount += $item->amount; } ``` 最终的代码如下所示: ``` $order = Order::where('user_id', $user_id)->where('status', 1)->select(); $now_time = date('Y-m-d H:i:s'); $days = 0; $user_amount = 0; foreach ($order as $item) { $order_time = $item->create_time; $order_amount = $item->amount; $order_date = date('Y-m-d', strtotime($order_time)); $now_date = date('Y-m-d', strtotime($now_time)); $days += (strtotime($now_date) - strtotime($order_date)) / 86400; $user_amount += $order_amount; } ``` 在上述代码中,$days为用户的消费天数,$user_amount为用户的消费金额。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值