<?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啊 库存和数据库里的同步......
}
}
}
}