当前位置:首页 > PHP

PHP接口防重推荐实现

2026-04-03 12:45:00PHP

防重机制的必要性

在API开发中,防止重复请求是保证数据一致性和系统稳定性的关键。重复请求可能导致重复扣款、重复提交订单等问题。

基于Token的防重方案

客户端在请求前先获取一个唯一Token(如UUID),服务端将该Token存入Redis并设置过期时间。
客户端携带Token发起请求,服务端校验Token是否存在:存在则处理请求并删除Token;不存在则拒绝请求。

// 生成Token并存储
$token = uniqid('api_', true);
$redis->setex("api_token:$token", 300, 1); // 5分钟有效期

// 验证Token
if (!$redis->exists("api_token:".$_POST['token'])) {
    die(json_encode(['code' => 400, 'msg' => '重复请求']));
}
$redis->del("api_token:".$_POST['token']);

基于时间戳+签名的防重

请求参数包含时间戳(timestamp)和签名(sign)。服务端校验时间戳是否在有效期内(如5分钟内),并重新计算签名是否匹配。

$secretKey = 'your_secret';
$timestamp = $_POST['timestamp'];
$sign = $_POST['sign'];

// 时间有效性校验
if (time() - $timestamp > 300) {
    die('请求已过期');
}

// 签名校验
$expectedSign = md5($timestamp . $secretKey);
if ($sign !== $expectedSign) {
    die('签名无效');
}

基于幂等性设计的防重

对写操作接口设计幂等性,如订单创建接口使用唯一业务ID(如订单号)。服务端先查询该ID是否存在,存在则直接返回结果。

$orderId = $_POST['order_id'];
if ($db->query("SELECT id FROM orders WHERE order_id = '$orderId'")) {
    die('订单已存在');
}
// 处理订单创建逻辑

基于限流的防重

使用Redis计数器限制单位时间内同一用户的请求次数。例如每分钟允许5次请求:

PHP接口防重推荐实现

$userId = $_SESSION['user_id'];
$key = "api_limit:$userId:" . date('YmdHi');
$count = $redis->incr($key);
$redis->expire($key, 60);

if ($count > 5) {
    die('请求过于频繁');
}

混合策略建议

  • 关键业务(如支付)建议组合Token+幂等性设计
  • 高频接口采用限流+时间戳签名
  • Redis存储需考虑集群部署时的数据一致性

标签: 接口PHP
分享给朋友:

相关文章

vue实现接口测试

vue实现接口测试

Vue 实现接口测试的方法 在 Vue 项目中实现接口测试,可以通过多种方式完成。以下是几种常见的方法: 使用 Axios 进行接口测试 Axios 是 Vue 中常用的 HTTP 客户端库,适合…

vue 接口与实现

vue 接口与实现

Vue 接口与实现的核心概念 Vue.js 的接口(Interface)与实现(Implementation)主要围绕组件的设计模式、API 的抽象层以及底层响应式原理展开。以下是关键点分析: 组件…

vue实现登录调用接口

vue实现登录调用接口

Vue 登录接口调用实现 安装 axios 在项目中安装 axios 用于发送 HTTP 请求: npm install axios 创建 API 服务文件 在 src 目录下创建 api/auth…

react共用组件如何请求接口

react共用组件如何请求接口

在React中实现共用组件的接口请求 共用组件的接口请求需要结合组件的复用性和数据独立性进行设计。以下是几种常见方法: 通过props传递数据 父组件负责获取数据并通过props传递给共用组件:…

react如何在model层写函数调接口

react如何在model层写函数调接口

React 中 Model 层函数调用接口的实现 在 React 应用中,Model 层通常负责数据管理和接口调用。可以通过以下方式组织代码: 创建独立的 API 服务模块 将接口调用封装在单独的…

PHP http长连接的实现

PHP http长连接的实现

HTTP 长连接基础概念 HTTP长连接(Keep-Alive)允许在单个TCP连接上发送和接收多个HTTP请求/响应,减少重复建立和断开连接的开销。HTTP/1.1默认启用长连接,而HTTP/1.0…