php分布式秒杀项目

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

请求参数

参数数据类型描述
actString方法名称 initRemoteStock:初始化远端库存数据
product_idInt产品ID
user_idInt用户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

请求参数

参数数据类型描述
actString方法名称 getRemoteStock:查询远端库存数据
product_idInt产品ID
user_idInt用户Id

返回参数

参数数据类型描述
codeString状态码
msgString返回信息
元素<响应>data
remote_total_countString远端原始总库存
remote_use_countString已用库存
remote_total_stockInt剩余库存

请求案例

curl --location --request GET '../api.php?act=getRemoteStock&product_id=1&user_id=1'

响应结果

{
    "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=initLocalStock&product_id=1&user_id=1

请求参数

参数数据类型描述
actString方法名称 initLocalStock:初始化本地库存数据
product_idInt产品ID
user_idInt用户Id

请求案例

curl --location --request GET '../api.php?act=initLocalStock&product_id=1&user_id=1'

响应结果

Status: 200 OK
6.4 查询本地库存数据

HTTP Request

GET …/api.php?act=getLocalStock&product_id=1&user_id=1

请求参数

参数数据类型描述
actString方法名称 getLocalStock:查询本地库存数据
product_idInt产品ID
user_idInt用户Id

返回参数

参数数据类型描述
codeString状态码
msgString返回信息
元素<响应>data
local_countInt本地总库存
local_useInt本地已用库存
local_stockInt本地剩余库存

请求案例

curl --location --request GET '../api.php?act=getLocalStock&product_id=1&user_id=1'

响应结果

{
    "code": "200",
    "msg": "success",
    "data": {
        "local_count": 150,
        "local_use": 0,
        "local_stock": 150
    }
}
6.5 抢购

HTTP Request

GET …/api.php?act=buy&product_id=1&user_id=1

请求参数

参数数据类型描述
actString方法名称 buy:抢购

请求案例

curl --location --request GET '../api.php?act=buy&product_id=1&user_id=1'

响应结果

{
    "code": 200,
    "msg": "success"
}   
6.6 查询订单信息

HTTP Request

GET …/api.php?act=searchOrders&product_id=1&user_id=1

返回参数

参数数据类型描述
actString方法名称 searchOrders:查询订单信息

请求案例

curl --location --request GET '../api.php?act=searchOrders&product_id=1&user_id=1'

响应结果

{
    "code": 200,
    "msg": "success",
    "data": [
        {
            "user_id": "1",
            "product_id": "1"
        },
        ...
    ]
}
6.7 远端和本地同步库存

HTTP Request

GET …/api.php?act=sync&product_id=1&user_id=1

返回参数

参数数据类型描述
actString方法名称 sync:远端和本地同步库存

请求案例

curl --location --request GET '../api.php?act=sync&product_id=1&user_id=1'

响应结果

{
    "code": 0,
    "msg": "同步库存成功",
    "data": {
        "local_stock_1": 849
    }
}
7.TODO
  • 异步创建订单
  • 告知用户请购成功
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_earnest

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值