swoole RabbitMQ长链接,预防假死或断开链接

话不多说直接上代码

/**

* 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();

你可能感兴趣的:(swoole RabbitMQ长链接,预防假死或断开链接)