php使用rabbitmq线程销毁,php 操作RabbitMQ

基本流程图

bda71e7b351373c34d2ee40af66e3aab.png如果exchange 没有绑定queue,则消息将会被丢弃

如果创建exchange,queue,并且已经绑定了,则可以直接使用

为了防止脚本出问题 可以配合supervisor

安装从网站 packagist.org 搜索rabbitmq插件

使用composer安装插件composer require php-amqplib/php-amqplib

使用连接RabbitMQ服务器

开始一个新的 channel

新建一个exchange

新建一个queue

绑定queue和exchange

发布一个消息

建立一个消费者并注册一个回调函数

监听数据

新建连接和channel

require "./vendor/autoload.php";

use PhpAmqpLib\Connection\AMQPStreamConnection;

use PhpAmqpLib\Message\AMQPMessage;

$host = "192.168.110.134";

$port = 5672;

$user = "test";

$pass = "test";

$vhost = "/";

try{

$connection = new AMQPStreamConnection($host, $port, $user, $pass, $vhost);

}catch (Exception $e){

echo 'Caught exception: ', $e->getMessage(), "\n";die;

}

$channel = $connection->channel();

复制代码

新建一个exchange

/*

name: $exchange

type: fanout

passive: false // don't check is an exchange with the same name exists

durable: false // the exchange won't survive server restarts

auto_delete: true //the exchange will be deleted once the channel is closed.

*/

try{

$name = 'example_direct_exchange';

$type = "direct";

$passive = false;

$durable = true;

$auto_delete = true;

$channel->exchange_declare($name, $type, $passive, $durable, $auto_delete);

}catch (Exception $e){

echo 'Caught exception: ', $e->getMessage(), "\n";die;

}复制代码

参数 name

exchange名称复制代码

参数 type

exchange类型

fanout 是广播类型的消息 会给所有绑定的queue发送数据复制代码

参数 passive

true

1.如果exchange已存在 则直接连接 并且不检查配置 比如已存在的exchange是fanout,新需要建立的是direct,也不会报错;

2.如果exchange不存在 则直接报错

false

1.如果exchange不存在 则创建新的exchange

2.如果exchange已存在 则判断配置是否相同。如果配置不相同 则直接报错。比如已存在的exchange是fanout,新需要建立的是direct,会报错。复制代码

参数 auto_delete

true

当最后一个消费者取消订阅之后 exchange会被自动删除 一般用于临时exchange复制代码

新建一个queue

/*

name: $queue // should be unique in fanout exchange.

passive: false // don't check if a queue with the same name exists

durable: false // the queue will not survive server restarts

exclusive: false // the queue might be accessed by other channels

auto_delete: true //the queue will be deleted once the channel is closed.

*/

$queue1 = 'example_direct_queue_1';

$channel->queue_declare($queue1, false, true, false, false);复制代码

将queue和exchange绑定起来

$queue1 = 'example_direct_queue_1';

$exchange_name = 'example_direct_exchange';

$channel->queue_bind($queue1, $exchange_name);复制代码

发布一个消息

$exchange_name = 'example_direct_exchange';

$messageBody = array(

'example_direct_value'=>date('Y-m-d H:i:s'),

);

$message = new AMQPMessage(json_encode($messageBody));

$channel->basic_publish($message, $exchange_name);复制代码

建立一个消费者并注册一个回调函数

/*

queue: Queue from where to get the messages

consumer_tag: Consumer identifier

no_local: Don't receive messages published by this consumer.

no_ack: Tells the server if the consumer will acknowledge the messages.

exclusive: Request exclusive consumer access, meaning only this consumer can access the queue

nowait:

callback: A PHP Callback

*/

$consumerTag = 'consumer';

$queue = 'example_direct_queue_1';

$channel->basic_consume($queue, "", false, false, false, false,function($msg){

$message = json_decode($msg->body, true);

file_put_contents("./mq.log", $message,FILE_APPEND);

$msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']);

});复制代码

参数no_ack

true

消息只有在返回一个ack之后,才会被删除

false

消息被取出之后 会被立即删除复制代码

监听数据

try {

while (count($channel->callbacks)) {

$channel->wait();

}

}

catch(\PhpAmqpLib\Exception\AMQPTimeoutException $e){

$channel->close();

$channel->close();

}复制代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用: 发挥多核CPU的优势是通过利用多线程来实现的。在现代计算机中,CPU通常具有多个核心,每个核心都可以同时执行多个线程。通过将任务分解成多个子任务,并使用线程同时处理这些子任务,可以充分利用多核CPU的性能优势。 引用: 线程池是一种管理和复用线程的机制。它提供了一个线程的集合,可以在需要时分配线程来执行任务,并在任务完成后将线程返回给线程池以便重用。使用线程池可以避免频繁创建和销毁线程带来的资源开销,提高程序的效率。 鉴于以上引用的内容,处理rabbitmq线程工单的一种常见做法是使用线程池。通过创建一个线程池,并将工单任务加入线程池的任务队列中,线程池会自动分配线程来处理这些任务。这样可以充分利用多核CPU的优势,并且避免频繁创建和销毁线程带来的性能开销。 具体而言,可以按照以下步骤来处理rabbitmq线程工单: 1. 创建一个线程池,可以使用Java提供的ExecutorService接口和Executors工具类来创建线程池。 2. 定义一个工单任务类,实现Runnable接口,并在run()方法中编写具体的工单处理逻辑。 3. 将需要处理的工单任务加入线程池的任务队列中,可以使用submit()或execute()方法来提交任务。 4. 线程池会自动分配线程来执行任务,并在任务完成后将线程返回给线程池以便重用。 5. 可以通过调用线程池的shutdown()方法来关闭线程池,确保所有任务都被处理完毕。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值