php生产者消费者,生产者消费者模式实现(docker+beanstalkd+redis)

本地通过docker 安装redis和beanstalkd,还可以通过swoole 添加定时器,以及进行多进程进行消费

#从仓库里将redis和beanstalkd下载

docker pull redis:5.0.7

docker pull schickling/beanstalkd

#查看镜像列表

docker images

#将beanstalkd运行在docker容器并映射到本地主机11300端口

docker run --name beanstalkd -d -it -p 11300:11300 428

docker run --name redis01 -d -it -p 6380:6379 redis:5.0.7

d:

cd D:\phpstudy_pro\WWW\test\beanstalkd

#安装

composer require pda/pheanstalk:3.1

composer require predis/predis:1.1

生产者

require "vendor/autoload.php";

use Pheanstalk\Pheanstalk;

try{

$p = new Pheanstalk('127.0.0.1',11300);

$data = [

'msg_id' => session_create_id(),

'tid' => time().uniqid()

];

// 当前的管道

$id = $p->putInTube('task',json_encode($data));

var_dump($id);

}catch (Exception $e){

}

消费者

require "vendor/autoload.php";

use Pheanstalk\Pheanstalk;

try{

$p = new Pheanstalk('127.0.0.1',11300);

$redis = new Predis\Client('tcp://127.0.0.1:6380');

while(1){

$job = $p->watch('task')->reserve();

if(!empty($job)){

$json = $job->getData();

$data = json_decode($json,true);

$state = $redis->get('job:'.$data['msg_id']);

if($state == 1){

echo '任务'.$data['msg_id'].'正在执行'. PHP_EOL;

$p->release($job,0,5);

continue;

}else if($state == 2){

echo '任务'.$data['msg_id'].'已经完成'. PHP_EOL;

continue;

}else{

echo '任务'.$data['msg_id'].'开始运行'. PHP_EOL;

$redis->setex('job:'.$data['msg_id'],6,1);

sleep(5);

$redis->set('job:'.$data['msg_id'],2);

//ack应答机制

$p->delete($job);

echo '5秒后,任务'.$data['msg_id'].'运行完成'. PHP_EOL;

}

}

}

}catch (Exception $e){

}

a223793ddb4c46bdeeec5cce7732a2e0.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值