作者:Xlady贩卖__铺 | 来源:互联网 | 2024-10-30 12:16
PHPSeckill是一个基于PHP、Lua和Redis构建的高效分布式秒杀系统。该项目利用php_apcu扩展优化性能,实现了高并发环境下的秒杀功能。系统设计充分考虑了分布式架构的可扩展性和稳定性,适用于大规模用户同时访问的场景。项目代码已开源,可在Gitee平台上获取。
PHP Seckill是使用php_apcu扩展、Lua、Redis实现的简单分布式秒杀项目
🔗 1.项目地址
https://gitee.com/imbee/php-seckill
🔍️ 2.业务分析
1.抢购秒杀时本地服务器进行库存验证
2.本地和远端同时进行库存扣减
3.扣减成功后将用户ID和产品ID写入MQ
4.异步创建订单
5.告知用户抢购成功
⚡️ 3.项目架构
📜 4.项目结构
api.php 业务接口
base.php 基类
🔧 5.php_apcu扩展安装
window安装
1.下载地址:https://windows.php.net/downloads/pecl/releases/apcu/
2.php_apcu.dll放置’\php\php7.x.x\ext’目录
3.修改php.ini
extension = php_apc.dll
4.重启服务
linux ubuntu 安装
1.安装php_apcu
apt install -y php-apcu
2.安装apcu向后兼容扩展
apt install -y php-apcu-bc
3.配置中启用
extension = apcu.so
apc.enabled = on
apc.shm_size = 256M
apc.enable_cli = on #测试环境启用
4.重启php-fpm进程
systemctl restart php7.x-fpm
🧪 6.测试案例
6.1 初始化远端库存数据
HTTP Request
GET …/api.php?act=initRemoteStock&product_id=1&user_id=1
请求参数
参数 | 数据类型 | 描述 |
---|
act | String | 方法名称 initRemoteStock:初始化远端库存数据 |
product_id | Int | 产品ID |
user_id | Int | 用户Id |
请求案例
curl --location --request GET '../api.php?act=initRemoteStock&product_id=1&user_id=1'
响应结果
Status: 200 OK
6.2 查询远端库存数据
HTTP Request
GET …/api.php?act=getRemoteStock&product_id=1&user_id=1
请求参数
参数 | 数据类型 | 描述 |
---|
act | String | 方法名称 getRemoteStock:查询远端库存数据 |
product_id | Int | 产品ID |
user_id | Int | 用户Id |
返回参数
参数 | 数据类型 | 描述 |
---|
code | String | 状态码 |
msg | String | 返回信息 |
元素<响应>data | | |
remote_total_count | String | 远端原始总库存 |
remote_use_count | String | 已用库存 |
remote_total_stock | Int | 剩余库存 |
请求案例
curl --location --request GET &#39;../api.php?act&#61;getRemoteStock&product_id&#61;1&user_id&#61;1&#39;
响应结果
{"code": "200","msg": "success","data": {"remote_total_count": "1000","remote_use_count": "0","remote_total_stock": 1000}
}
6.3 初始化本地库存数据
HTTP Request
GET …/api.php?act&#61;initLocalStock&product_id&#61;1&user_id&#61;1
请求参数
参数 | 数据类型 | 描述 |
---|
act | String | 方法名称 initLocalStock:初始化本地库存数据 |
product_id | Int | 产品ID |
user_id | Int | 用户Id |
请求案例
curl --location --request GET &#39;../api.php?act&#61;initLocalStock&product_id&#61;1&user_id&#61;1&#39;
响应结果
Status: 200 OK
6.4 查询本地库存数据
HTTP Request
GET …/api.php?act&#61;getLocalStock&product_id&#61;1&user_id&#61;1
请求参数
参数 | 数据类型 | 描述 |
---|
act | String | 方法名称 getLocalStock:查询本地库存数据 |
product_id | Int | 产品ID |
user_id | Int | 用户Id |
返回参数
参数 | 数据类型 | 描述 |
---|
code | String | 状态码 |
msg | String | 返回信息 |
元素<响应>data | | |
local_count | Int | 本地总库存 |
local_use | Int | 本地已用库存 |
local_stock | Int | 本地剩余库存 |
请求案例
curl --location --request GET &#39;../api.php?act&#61;getLocalStock&product_id&#61;1&user_id&#61;1&#39;
响应结果
{"code": "200","msg": "success","data": {"local_count": 150,"local_use": 0,"local_stock": 150}
}
6.5 抢购
HTTP Request
GET …/api.php?act&#61;buy&product_id&#61;1&user_id&#61;1
请求参数
参数 | 数据类型 | 描述 |
---|
act | String | 方法名称 buy:抢购 |
… | … | … |
请求案例
curl --location --request GET &#39;../api.php?act&#61;buy&product_id&#61;1&user_id&#61;1&#39;
响应结果
{"code": 200,"msg": "success"
}
6.6 查询订单信息
HTTP Request
GET …/api.php?act&#61;searchOrders&product_id&#61;1&user_id&#61;1
返回参数
参数 | 数据类型 | 描述 |
---|
act | String | 方法名称 searchOrders:查询订单信息 |
… | … | … |
请求案例
curl --location --request GET &#39;../api.php?act&#61;searchOrders&product_id&#61;1&user_id&#61;1&#39;
响应结果
{"code": 200,"msg": "success","data": [{"user_id": "1","product_id": "1"},...]
}
6.7 远端和本地同步库存
HTTP Request
GET …/api.php?act&#61;sync&product_id&#61;1&user_id&#61;1
返回参数
参数 | 数据类型 | 描述 |
---|
act | String | 方法名称 sync:远端和本地同步库存 |
… | … | … |
请求案例
curl --location --request GET &#39;../api.php?act&#61;sync&product_id&#61;1&user_id&#61;1&#39;
响应结果
{"code": 0,"msg": "同步库存成功","data": {"local_stock_1": 849}
}
7.TODO