tp框架 使用php amqp,ThinkPHP的AMQP库(支持RabbitMQ)

1.安装依赖库

composer require php-amqplib/php-amqplib

地址:https://github.com/php-amqplib/php-amqplib

2. mq生产者.php

include(__DIR__ . '../../public/config.php');

use PhpAmqpLib\Connection\AMQPStreamConnection;

use PhpAmqpLib\Message\AMQPMessage;

/**

* Created by PhpStorm.

* User: pandeng

* Date: 2017-07-26

* Time: 21:51

*/

class MessageQueue

{

const exchange = 'router';

const queue = 'msgs';

public static function pushMessage($data)

{

$connection = new AMQPStreamConnection(HOST, PORT, USER, PASS, VHOST);

$channel = $connection->channel();

$channel->queue_declare(self::queue, false, true, false, false);

$channel->exchange_declare(self::exchange, 'direct', false, true, false);

$channel->queue_bind(self::queue, self::exchange);

$messageBody = $data;

$message = new AMQPMessage($messageBody, array('content_type' => 'text/plain', 'delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT));

$channel->basic_publish($message, self::exchange);

$channel->close();

$connection->close();

return "ok";

}

}

3.消费者.php

namespace app\index\controller;

include(__DIR__ . '../../../../public/config.php');

use PhpAmqpLib\Connection\AMQPStreamConnection;

use think\Controller;

use think\Log;

use think\Request;

use think\Db;

class MessageConsume extends Controller

{

const exchange = 'router';

const queue = 'msgs';

const consumerTag = 'consumer';

function shutdown($channel, $connection)

{

$channel->close();

$connection->close();

write_log("closed",3);

}

function process_message($message)

{

if ($message->body !== 'quit') {

$obj = json_decode($message->body);

if (!isset($obj->id)) {

echo 'error data\n';

write_log("error data:" . $message->body, 2);

} else {

try {

write_log("data:" . json_encode($message));

} catch (\Think\Exception $e) {

write_log($e->getMessage(), 2);

write_log(json_encode($message), 2);

} catch (\PDOException $pe) {

write_log($pe->getMessage(), 2);

write_log(json_encode($message), 2);

}

}

}

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

// Send a message with the string "quit" to cancel the consumer.

if ($message->body === 'quit') {

$message->delivery_info['channel']->basic_cancel($message->delivery_info['consumer_tag']);

}

}

/**

* 启动

*

* @return \think\Response

*/

public function start()

{

$connection = new AMQPStreamConnection(HOST, PORT, USER, PASS, VHOST);

$channel = $connection->channel();

$channel->queue_declare(self::queue, false, true, false, false);

$channel->exchange_declare(self::exchange, 'direct', false, true, false);

$channel->queue_bind(self::queue, self::exchange);

$channel->basic_consume(self::queue, self::consumerTag, false, false, false, false, array($this, 'process_message'));

register_shutdown_function(array($this, 'shutdown'), $channel, $connection);

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

$channel->wait();

}

write_log("starting",3);

}

}

4. 启动消费者(守护进程)

nohup php index.php index/Message_Consume/start &

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值