话不多说直接上代码
/**
* Created by PhpStorm.
* User: lyb
* Date: 2022/2/11
* Time: 13:28
*/
require_once __DIR__ . '/vendor/autoload.php'; //composer install php-amqplib
class OrderMq
{
public function __construct() {
$this->serv = new swoole_http_server(
"0.0.0.0",
"9502"
);
$this->serv->set(array(
'worker_num' => 2, //工作进程数量
'max_conn' => 1000,
'max_request' => 10000,
// 'debug_mode'=> 1,
'task_worker_num'=>2,
// 'daemonize' => true, //是否作为守护进程
));
//内存表
$time_table = new swoole_table(10);
$time_table->column( "time", swoole_table::TYPE_STRING, 20);
$time_table->create();
$this->serv->tb = $time_table;
$this->serv->tb->set('time-1', ['time' =>time()]);
$this->serv->on('Start', array($this, 'onStart'));
$this->serv->on('WorkerStart', array($this, 'onWorkerStart'));
$this->serv->on('connect', array($this, 'onConnect'));
$this->serv->on('request' , array( $this , 'onRequest'));
$this->serv->on('Receive', array($this, 'onReceive'));
$this->serv->on('Close', array($this, 'onClose'));
$this->serv->on('Task', array($this, 'onTask'));
$this->serv->on('Finish', array($this, 'onFinish'));
$this->serv->start();
}
public function onStart( $serv ) {
echo "Start\n";
swoole_timer_after(3000, function () {
echo "after 3000ms.\n";
});
}
public function onRequest($request, $response){
/// $this->serv->task("");
$response->end("hello world");
}
public function onConnect($serv, $fd){
//echo "Connected\n";
}
public function onWorkerStart( $serv , $workerId) {
swoole_set_process_name("swoole_mq_9502 master {$workerId}");
echo "Worker#{$workerId} is started\n";
$tainfo = $serv->tb->get("time-1");
var_dump($tainfo['time']);
try {
$AMQConfig = array(
'host' => '*',
'port' => '5672',
'login' => '*',
'password' => '*',
'vhost'=>'*
);
// 建立连接
$conn = new \PhpAmqpLib\Connection\AMQPStreamConnection($AMQConfig['host'],$AMQConfig['port'],$AMQConfig['login'],$AMQConfig['password'],$AMQConfig['vhost'],
false,
'AMQPLAIN',
null,
'en_US',
3.0,
3.0,
null,
false,
10,//这里一定要配置自动心态检测,不加时间长会断开
0.0,
null
);
// 创建通道
$channel = $conn->channel();
// 创建交换机
/**
* name:xxx 交换机名称
* type:direct 类型 fanut,direct,topic,headers
* passive:false 不存在自动创建,如果设置true的话,返回OK,否则失败
* durable:false 是否持久化
* auto_delete:false 自动删除,最后一个
*/
//$channel->exchange_declare($AMQConfig['vhost'],AMQP_EX_TYPE_DIRECT,false,true,false);
// 创建队列
/**
* name:xxx 队列名称
* passive:false 不存在自动创建,如果设置true的话,返回OK,否则失败
* durable:false 是否持久化
* exclusive:false 是否排他,如果为true的话,只对当前连接有效,连接断开后自动删除
* auto_delete:false 自动删除,最后一个
*/
$queueName = "*";
$channel->queue_declare($queueName,false,true,false,false);
// 绑定
/**
* $queue 队列名称
* $exchange 交换机名称
* $routing_key 路由名称
*/
$routeKey = "*";
// $channel->queue_bind($queueName,'rrd',$routeKey);
// 消费
/**
* $queue = '', 被消费队列名称
* $consumer_tag = '', 消费者客户端标识,用于区分客户端
* $no_local = false, 这个功能属于amqp的标准,但是rabbitmq未实现
* $no_ack = false, 收到消息后,是否要ack应答才算被消费
* $exclusive = false, 是否排他,即为这个队列只能由一个消费者消费,适用于任务不允许并发处理
* $nowait = false, 不返回直接结果,但是如果排他开启的话,则必须需要等待结果的,如果二个都开启会报错
* $callback = null, 回调函数处理逻辑
*/
// 回调
$callback = function ($msg) use ($workerId) {
var_dump($workerId."-----{$msg->body}");
// echo "tag:".$msg->delivery_info["delivery_tag"]."
";
$msg->delivery_info["channel"]->basic_ack($msg->delivery_info["delivery_tag"]);
};
$channel->basic_qos(null, 1, null);
$channel->basic_consume($queueName,"",false,false,false,false,$callback);
if($channel->is_consuming())
{
echo 'mq链接成功';
}
else
{
$this->write_log("mq断开连接");
}
// 监听
while ($channel->is_consuming()) {
$channel->wait();
}
} catch (\Throwable $e) {
$this->write_log("错误捕获:".$e->getMessage());
}
}
public function onReceive(swoole_server $serv, $fd, $from_id, $data){
$serv->task("");
}
public function onClose( $serv, $fd, $from_id ) {
echo "Client {$fd} close connection\n";
}
function write_log($txt){
$date=date("Ymd");
//日志内容
$content = [
'date:' => date("Ymd H:i:s"),
'txt:' => $txt,
];
//存入文件
swoole_async_writefile(__DIR__."/{$date}.txt", json_encode($content,JSON_UNESCAPED_UNICODE).PHP_EOL, function($filename){
}, FILE_APPEND);
}
public function onTask($serv,$task_id,$from_id, $data) {
//准备在这里把消息发送到rabbitmq队列里
}
public function onFinish($serv,$task_id, $data) {
}
//是否为json
function is_json($data = '', $assoc = false) {
$data = json_decode($data, $assoc);
if ($data && (is_object($data)) || (is_array($data) && !empty(current($data)))) {
return $data;
}
return false;
}
}
new OrderMq();