php 基于redis队列 异步订单处理方式

作者: 分类: php 时间: 2022-05-09 评论: 暂无评论
<?php
/**
 * Created by PhpStorm.
 * User: yann
 * Date: 2017/8/3
 * Time: 上午10:49
 */

$redis_ip = '127.0.0.1';

$logs_path = '/data/php/logs/';

$log_name = 'laravel-' . date('Y-m-d') . '.log';

$mysql_ip = '127.0.0.1';

for ($i = 0; $i <= 5; $i++) //开进程

{

    $ret = pcntl_fork(); //生成进程

    if ($ret == 0) {

        while (true) //做一个循环,让进程反复运行

        {

            $redis = new Redis();//连接redis

            $redis->connect($redis_ip, 6379);

            if (count($redis->keys('panicbuying')) == 0) //判断队列中是否有序列,如果没有则继续 “死”循环

            {

                sleep(1);

                continue;

            }

            $getjob = $redis->zrange('panicbuying', 0, 0); //从队列中取出一个

            $color_id = json_decode($getjob[0], 1)['stock_id'];

            if ($redis->setnx("buy_lock_" . $color_id, 1) == 1) //加锁 后期需要优化防止出错卡死 设置超时时间

            {

                $num = json_decode($getjob[0], 1)['num'];

                $pro_stock = $redis->hget('products_stock', $color_id);

                $surplus_stock = $pro_stock - $num;

                $redis->multi(); // redis事务开始

                if ($surplus_stock >= 0) {

                    $redis->hset('products_stock', $color_id, $surplus_stock);

                }

                $redis->zrem('panicbuying', $getjob[0]); //删除当前队列

                $redis->del("buy_lock_" . $color_id); //解锁

                $redis->exec(); //结束事务

                // 这里写你自己需要的一些处理 比如 写一些log啊 库存和数据库里的同步......

            }

        }

    }

}
标签: none

订阅本站(RSS)