/** * 频率控制函数 * @param string $product 保持唯一 * @param string $key 限制频率的维度 比如uid * @param int $millisecond 毫秒间隔内只可以访问1次 * @return bool true-可以正常访问 false-命中频率控制 */ function controlRate($product, $key, $millisecond) { if (empty($product) || empty($key) || !is_int($millisecond) || $millisecond <= 0) { return true; } $millTime = intval(microtime(true) * 1000); $key = sprintf('ctrl_%s_%s', $product, $key); $redis = new Redis(); $redis->connect('redis'); $redis->auth('123456'); $lastTimeRes = $redis->get($key); if ($lastTimeRes === false) { $addRes = $redis->setNx($key, $millTime); // 此处有设置失败的风险 $redis->expire($key, 86400); return $addRes; } // 若存在 则比对现在的时间 若频率超过x毫秒 则提示过于频繁 $nowTime = $millTime; if ($nowTime - intval($lastTimeRes) < $millisecond) { return false; } // 记录最新时间 return $redis->setEx($key, 86400, $millTime); }