当前位置:首页 > PHP

php 实现秒杀

2026-02-13 13:32:20PHP

秒杀系统设计要点

高并发秒杀系统的核心在于解决库存超卖、系统崩溃等问题。PHP实现需结合缓存、队列、数据库锁等技术。

使用Redis原子操作控制库存

Redis的原子性操作能有效避免超卖。将库存预热到Redis中,利用DECRINCRBY进行原子减库存:

php 实现秒杀

$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

// 检查库存
$remaining = $redis->get('seckill_stock');
if ($remaining <= 0) {
    die('已售罄');
}

// 原子减库存
if ($redis->decr('seckill_stock') >= 0) {
    // 生成订单(异步处理)
    enqueue_order_queue($user_id, $product_id);
    echo '抢购成功';
} else {
    $redis->incr('seckill_stock'); // 回滚
    echo '库存不足';
}

消息队列异步处理

使用RabbitMQ或Kafka将订单请求异步化,减轻数据库压力:

php 实现秒杀

function enqueue_order_queue($user_id, $product_id) {
    $connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
    $channel = $connection->channel();
    $channel->queue_declare('order_queue', false, true, false, false);

    $msg = new AMQPMessage(json_encode([
        'user_id' => $user_id,
        'product_id' => $product_id,
        'time' => time()
    ]));

    $channel->basic_publish($msg, '', 'order_queue');
    $channel->close();
    $connection->close();
}

数据库最终一致性

消费者处理队列消息时,使用数据库事务确保数据一致:

// 消费者端代码示例
$db = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
$db->beginTransaction();

try {
    $stmt = $db->prepare("UPDATE products SET stock = stock - 1 WHERE id = ? AND stock > 0");
    $stmt->execute([$product_id]);

    if ($stmt->rowCount() > 0) {
        $order_stmt = $db->prepare("INSERT INTO orders (...) VALUES (...)");
        $order_stmt->execute([...]);
        $db->commit();
    } else {
        $db->rollBack();
    }
} catch (Exception $e) {
    $db->rollBack();
}

限流与防刷

使用令牌桶或漏桶算法控制流量:

// Redis实现简单限流
function is_allowed($user_id, $limit = 5) {
    $key = "seckill_limit:$user_id";
    $count = $redis->incr($key);
    if ($count == 1) {
        $redis->expire($key, 60);
    }
    return $count <= $limit;
}

系统优化建议

前端采用倒计时同步策略,避免客户端时间不准导致提前请求。Nginx层可做请求合并,PHP建议使用Swoole扩展提升并发能力。静态资源与动态接口分离部署,数据库考虑读写分离。

标签: 秒杀php
分享给朋友:

相关文章

php实现文件下载

php实现文件下载

PHP实现文件下载的方法 通过PHP实现文件下载功能,可以采用多种方式,以下是几种常见的实现方法: 使用header()函数强制下载 设置HTTP头信息,强制浏览器下载文件而非直接打开: $fi…

php 实现自动收货

php 实现自动收货

PHP 实现自动收货功能 自动收货功能通常用于电商系统,在订单超过一定时间未手动确认收货时自动完成订单。以下是实现方法: 数据库设计 需要订单表包含以下关键字段: CREATE TABLE…

php验证码的实现

php验证码的实现

PHP 验证码实现方法 使用 GD 库生成基础验证码 创建画布并生成随机字符串作为验证码内容: session_start(); $width = 120; $height = 40; $image…

php实现登陆

php实现登陆

PHP 实现登录功能 创建登录表单 在 HTML 文件中创建一个登录表单,包含用户名和密码输入框,表单的 action 属性指向处理登录的 PHP 文件。 <form action="logi…

php https实现

php https实现

PHP 中实现 HTTPS 的方法 在 PHP 中实现 HTTPS 主要通过配置服务器和编写代码来确保通信的安全性。以下是几种常见的方法: 配置服务器支持 HTTPS 确保服务器已安装 SSL/T…

php搜索功能的实现

php搜索功能的实现

实现PHP搜索功能的方法 数据库搜索 使用SQL的LIKE语句进行模糊匹配,适用于简单的搜索需求。 $searchTerm = $_GET['search']; $query = "SELECT *…