php 生产者消费者_实现生产者和消费者

本文介绍了使用PHP编写的Mysql和Redis队列生产者(Producer)和消费者(Consumer)示例,展示了如何通过自动加载机制和数据库驱动的队列系统进行消息传递。内容包括了初始化队列、生产任务和消费任务的详细代码以及异常处理。
摘要由CSDN通过智能技术生成

# 自动加载

*boot.php*

```

// +----------------------------------------------------------------------

// | boot.php

// +----------------------------------------------------------------------

// | Description: 自动加载

// +----------------------------------------------------------------------

// | Time: 2018/12/19 下午5:51

// +----------------------------------------------------------------------

// | Author: Object,半醒的狐狸<2252390865@qq.com>

// +----------------------------------------------------------------------

define('ROOT',realpath('./'));

spl_autoload_register(function ($class) {

$file_path = str_replace('\\', '/', $class);

$file = $file_path . '.php';

if (!file_exists($file)) {

throw new Exception('找不到文件:' . $file);

}

include_once $file;

return true;

});

```

# Mysql 队列生产者

*Producer.php*

```

// +----------------------------------------------------------------------

// | Producer.php

// +----------------------------------------------------------------------

// | Description: 生产者

// +----------------------------------------------------------------------

// | Time: 2018/12/19 下午3:05

// +----------------------------------------------------------------------

// | Author: Object,半醒的狐狸<2252390865@qq.com>

// +----------------------------------------------------------------------

include_once 'boot.php';

try {

Queue::init('Mysql', [

'dsn' => 'mysql:host=mysql;dbname=test',

'username' => 'root',

'password' => 'root',

'table' => 'queues',

'ttr' => 60,

]); // 队列初始化

// 生产者放入消息

$job = new Driver\Job([

'job_data' => json_encode(['order_id' => time(), 'user_id' => 0001]),

'tube' => 'test'

]);

$job = Queue::put($job);

} catch (Exception $e) {

var_dump($e->getMessage());

}

```

# Mysql 队列消费者

*Consumer.php*

```

// +----------------------------------------------------------------------

// | Consumer.php

// +----------------------------------------------------------------------

// | Description: 消费者

// +----------------------------------------------------------------------

// | Time: 2018/12/19 下午4:55

// +----------------------------------------------------------------------

// | Author: Object,半醒的狐狸<2252390865@qq.com>

// +----------------------------------------------------------------------

include_once 'boot.php';

try {

Queue::init('Mysql', [

'dsn' => 'mysql:host=mysql;dbname=test',

'username' => 'root',

'password' => 'root',

'table' => 'queues',

'ttr' => 60,

]);

while (1) {

// 死循环,使进程一直在cli中运行,不断从消息队列读取数据

$job = Queue::reserve('test');

if (!$job->isEmpty()) {

echo $job->job_data . PHP_EOL;

sleep(2);

if (Queue::delete($job)) {

echo "job was deleted" . PHP_EOL;

} else {

echo "delete failed" . PHP_EOL;

}

}

}

} catch (Exception $e) {

var_dump($e->getMessage());

}

```

# Redis 队列生产者

*RedisProducer.php*

```

// +----------------------------------------------------------------------

// | RedisProducer.php

// +----------------------------------------------------------------------

// | Description: 生产者

// +----------------------------------------------------------------------

// | Time: 2018/12/19 下午3:05

// +----------------------------------------------------------------------

// | Author: Object,半醒的狐狸<2252390865@qq.com>

// +----------------------------------------------------------------------

include_once 'boot.php';

try {

Queue::init('Redis', [

'ip' => 'redis',

'port' => 6379,

'tubes' => 'tubes'

]); // 队列初始化

// 生产者放入消息

$job = new Driver\Job([

'job_data' => json_encode(['order_id' => time(), 'user_id' => '0001']),

'tube' => 'default'

]);

$job = Queue::put($job);

echo $job->id . PHP_EOL;

} catch (Exception $e) {

var_dump($e->getMessage());

}

```

# Redis 队列消费者

*RedisConsumer.php*

```

// +----------------------------------------------------------------------

// | RedisConsumer.php

// +----------------------------------------------------------------------

// | Description: 消费者

// +----------------------------------------------------------------------

// | Time: 2018/12/19 下午4:55

// +----------------------------------------------------------------------

// | Author: Object,半醒的狐狸<2252390865@qq.com>

// +----------------------------------------------------------------------

include_once 'boot.php';

try {

Queue::init('Redis', [

'ip' => 'redis',

'port' => 6379,

'tubes' => 'tubes'

]); // 队列初始化

while (1) {

// 死循环,使进程一直在cli中运行,不断从消息队列读取数据

$job = Queue::reserve('default');

if (!$job->isEmpty()) {

echo $job->job_data . PHP_EOL;

sleep(2);

if (Queue::delete($job)) {

echo "job was deleted" . PHP_EOL;

} else {

echo "delete failed" . PHP_EOL;

}

}

}

} catch (Exception $e) {

var_dump($e->getMessage());

}

```

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值