supervisor 简单理解

1. 找到配置文件,/etc/supervisor/supervisor.conf

添加
[include]
files = /www/server/panel/plugin/supervisor/profile/*.ini

test.ini文件内容

[program:rabbitmq-consume]
process_name=%(program_name)s_%(process_num)02d
directory=/www/wwwroot
command=/www/server/php/73/bin/php /www/wwwroot/project/yii swoole-consume/run
autostart=true
autorestart=true
user=www
numprocs=1
redirect_stderr=true
stdout_logfile=/www/wwwlogs/project_rabbitmq_consume.log


[program:swoole-crontab-server]
process_name=%(program_name)s_%(process_num)02d
directory=/www/wwwroot
command=/www/server/php/73/bin/php /www/wwwroot/project/yii swoole-crontab/server-run
autostart=true
autorestart=true
user=www
numprocs=1
redirect_stderr=true
stdout_logfile=/www/wwwlogs/project_swoole_crontab.log


[program:swoole-crontab-client]
process_name=%(program_name)s_%(process_num)02d
directory=/www/wwwroot
command=/www/server/php/73/bin/php /www/wwwroot/project/yii swoole-crontab/client-run
autostart=true
autorestart=true
user=www
numprocs=2
redirect_stderr=true
stdout_logfile=/www/wwwlogs/project_swoole_crontab.log

swoole-consume/run.php

<?php

/**
 * 进程池多消费者,多队列消费rabbitMQ队列
 */
namespace console\controllers;

use common\enums\RabbitMqEnum;
use console\controllers\swoole_server\BaseSwooleServer;
use Exception;
use PhpAmqpLib\Exchange\AMQPExchangeType;
use ReflectionMethod;
use Swoole\Process\Pool;
use Yii;
/**
 * rabbitMQ队列消费者进程池
 */
class SwooleConsumeController extends BaseSwooleServer
{
    public $worker_num;
    
    public $consume_setting = [
    ];
    // 进程与消费者的对应关系
    public $worker_queue_relate = [];
    public function init(){
        $worker_num_arr = array_column($this->consume_setting,'worker_num');
        $this->worker_num = array_sum($worker_num_arr);
        $worker_id = 0;
        foreach($this->consume_setting as $key=>$queue_info){
            $wait_assign_worker_num = $queue_info['worker_num'];
            while($wait_assign_worker_num > 0){
                $this->worker_queue_relate[$worker_id] = $key;
                $worker_id ++;
                $wait_assign_worker_num --;
            }
        }
    }

    /**
     * 启动消费者
     * @return void
     */
    public function actionRun(){
        // 计数器,当进程反复退出重启时,可能代码有致命错误,需要处理
        // $atomic = new Atomic();
        $pool = new Pool($this->worker_num);
        //绑定一个事件
        $pool->on("WorkerStart", function ($pool, $worker_id) {
            echo 'worker_id:'.$worker_id.PHP_EOL;
            $queue_key = $this->worker_queue_relate[$worker_id];
            $queue_info = $this->consume_setting[$queue_key];
            //设置进程名称
            swoole_set_process_name('swoole : rabbitmq_process '.$queue_info['queue_name'].'_'.$worker_id);
            $process = $pool->getProcess($worker_id);
            try {
                Yii::$app->services->rabbitMq->listen($queue_info['exchange'], $queue_info['queue_name'], function ($message) {
                    $res = $this->handleMessage($message);
                    Yii::getLogger()->flush(true);
                    return $res;
                });
            } catch (Exception $e) {
                Yii::getLogger()->flush(true);
                echo 'exception:' . $e->getMessage().$e->getFile().':'.$e->getLine().PHP_EOL;
            }
        });

        //子进程关闭
        $pool->on("WorkerStop", function ($pool, $workerId) {
            echo "Worker#{$workerId} is stopped\n";
        });
        $pool->start();
    }

    /**
     * 消息处理
     * @param AMQPMessage $message
     * @throws
     * @return bool
     */
    private function handleMessage($message)
    {
        $date = date('Y-m-d H:i:s');
        $routing_key = $message->getRoutingKey();
        $flush = '['.$date.']'.'队列(' . $routing_key . ')接收到消息,其内容为:' . $message->getBody();

        $message_body = json_decode($message->getBody(), true);

        $class = $message_body['handler_class'];
        $method = $message_body['method'];
        $data = $message_body['data'];
        $data['message_id'] = $message->get('message_id');
        if (!method_exists($class, $method)) {
            //方法不存在,忽略
            Yii::error('actionTaskConsume: class' . $class . ' ,method:' . $method . ' ,not exist');
            return false;
        }

        $reflect_method = new ReflectionMethod($class, $method);
        Yii::$app->db->close();
        Yii::$app->redis->close();
        $time1 = time();
        if ($reflect_method->isStatic()) {
            $res = $class::$method($data);
            if ($res === false) Yii::error($class::$static_error ?? '未定义错误');
            //if($res === false) throw new Exception($class::$static_error ?? '未定义错误');
        } else {
            $obj = new $class();
            $res = $obj->$method($data);
            if ($res === false) Yii::error($obj->error ?? '未定义错误');
            //if($res === false) throw new Exception($obj->error ?? '未定义错误');
        }
        $time2 = time();
        $total_time = $time2 - $time1;
        if ($total_time > 1) $flush .= ',队列耗时:' .$total_time . '秒';
        echo $flush . PHP_EOL . PHP_EOL;
        return $res;
    }

    /**
     * 重启消费者
     * @return void
     */
    public function actionRestartConsume(){
        
    }
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Supervisor是一个用于监控和管理进程的工具。你可以使用以下步骤安装和配置Supervisor: 1. 首先,通过以下命令安装supervisor: ``` sudo yum install python-setuptools sudo easy_install supervisor ``` 2. 接下来,你可以使用`go get`命令安装supervisor-event-listener插件。运行以下命令: ``` go get -u github.com/ouqiang/supervisor-event-listener ``` 3. 现在,你可以配置Supervisor。打开Supervisor的配置文件,在文件中添加以下配置: ``` [eventlistener:supervisor-event-listener] command=/path/to/supervisor-event-listener ``` 4. 保存并退出配置文件。 如果你遇到supervisor.sock问题,你可以尝试以下解决方法: 1. 使用以下命令查找supervisor.sock文件的位置: ``` find / -name supervisor.sock ``` 2. 找到supervisor.sock文件后,使用以下命令删除它: ``` unlink /path/to/supervisor.sock ``` 以上是安装和配置Supervisor以及解决supervisor.sock问题的方法。希望对你有帮助!<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Supervisor 维护 Go进程](https://blog.csdn.net/weixin_34004576/article/details/91929157)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [supervisor-event-listener:Supervisor事件通知, 支持邮件, Slack, WebHook](https://download.csdn.net/download/weixin_42110038/18741056)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值