//生产者类
public function index()
{
//beanstalkd 消息队列 默认端口11300
$pda = Pheanstalk::create('127.0.0.1');
//生产者
$tubeName = 'order';//管道名称
//模拟100人请求秒杀
for($i = 0;$i<100;$i++){
$uid = rand(10000,99999);
//获取当前队列已经拥有的数量,人数小于10 加入队列
if(!in_array($tubeName,$pda->listTubes())){
$pda->useTube($tubeName);
}
$jobsNum = $pda->statsTube($tubeName)['total-jobs'];
$num = 10;//秒杀数量
if($jobsNum<$num){
$pda->useTube($tubeName)->put($uid);
dump($uid."秒杀成功<br>");
}else{
//队列达到10人 秒杀结束
dump('秒杀已结束<br>');
}
}
dump($pda->statsTube($tubeName));
dump($pda->listTubes());
}
//消费者类
public function xiaofei(){
$pda = Pheanstalk::create('127.0.0.1');
//获取管道 并消费
$tubeName = 'order';//管道名称
//取出管道中任务总数
$jobNum = $pda->statsTube($tubeName)['total-jobs'];
dump('任务总数:'.$jobNum);
//循环取出管道中任务 插入数据库
for ($i =0;$i<$jobNum;$i++){
//监听管道 将任务取出
$job = $pda->watch($tubeName)->reserve();
//取出uid
$uid = $job->getData();
if(!$uid){
sleep(2);
continue;
}
//生成订单号
$oid = $this->createOrderId();
$orderData = [
'userid' => $uid,
'orderid' => $oid,
'addtime' => time()
];
$order = Order::create($orderData);
$id = $order->id;
dump($id);
if($id){
$pda->delete($job);
}
}
}
public function createOrderId(){
$str = uniqid();//基于以微秒计的当前时间,生成一个唯一的 ID。
$str1 = substr($str,7,13);//截取13个长度
$arr = str_split($str1,1);//字符串转为数组
$arr1 = array_map('ord',$arr);//为数组的每个元素应用回调函数 ord 得到指定字符的ASCII
$str3 = implode(NULL,$arr1);//数组转字符串
$str = substr($str3,0,8);
return $str;
}
beanstlkd实战小demo
最新推荐文章于 2024-07-23 19:05:38 发布