1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/cc_1234-Group-Co

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
fu-wu-yi-chang.md 5.3 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 02.12.2024 11:43 b1fd262

Уведомление о сбоях в работе сервисов

Здесь используется swiftMail как класс для отправки писем.

Composer требует swiftmailer/swiftmailer

composer require swiftmailer/swiftmailer

В файле конфигурации config создаём param.php и настраиваем информацию, связанную с отправкой писем

<?php
return [
    #swift mail
    'swift.mail.host' => 'smtp.exmail.qq.com',
    'swift.mail.port' => 25,
    'swift.mail.username' => 'xxx@xxx.com',
    'swift.mail.password' => 'xxx',
    'swift.mail.to' => ['xxx@xxx.com', 'aa@aaa.com'],
];

Пишем слушатель для события KernalEvent::SERVICE_FAIL

В файле config/dev/listener.php добавляем следующую конфигурацию:

<?php
return [
    'services' => [
        [
            'eventName' => 'kernal.service_fail',
            'listener'  => 'src\Common\Listeners\ServiceFailListener',
            'priority'  => 10,
        ],
    ]
];

Создаём класс src\Common\Listeners\ServiceFailListener

Мы используем redis для задач очереди и запускаем дочерний процесс для обработки.

<?php
namespace src\Common\Listeners;
use AsyncRedis;
class ServiceFailListener extends \Listener {
    public function setMethod() {
        return 'onServiceFail';
    }
    /**
     * Событие сбоя сервиса
     * @param  \Event
     */
    public function onServiceFail(\Event $event) {
        //Когда сервис вызывает сбой, вы можете сделать отчёт на платформе мониторинга, отправить письмо и т. д. Пожалуйста, используйте асинхронный способ для отчёта
        $data = $event->getProperty();
        //Нет доступных сервисов
        yield AsyncRedis::rPush('service_fail', json_encode([
            'service' => $data['service'],
            'cmd' => $data['cmd'],
            'ip' => $data['ip'],
            'port' => $data['port'],
        ]));
        yield;
    }
}

Настраиваем process в config/dev/app.php

'process' => [
    'src\Common\Process\ServiceFailProcess',
],

Реализуем src\Common\Process\ServiceFailProcess для обработки очереди и отправки писем

<?php
namespace src\Common\Process;
use Group\Process;
use Redis;
use swoole_process;
use Group\Config\Config;
class ServiceFailProcess extends Process {
    public function register() {
        $config = Config::get("database::redis");
        $config = $config['default'];
        $redis = new Redis;
        $redis->connect($config['host'], $config['port']);
        if (isset($config['auth'])) {
            $redis->auth($config['auth']);
        }
        $redis->setOption(Redis::OPT_PREFIX, isset($config['prefix']) ? $config['prefix'] : '');
        $process = new swoole_process(function($process) use ($redis) {
            //Опрашиваем
            swoole_timer_tick(1000, function() use ($redis) {
                $errors = $redis->lPop('service_fail');
                if ($errors) {
                    $errors = json_decode($errors, true);
                    //Отправляем письмо
                    if (is_array($errors['cmd'])) {
                        $cmd = implode(",", $errors['cmd']);
                    } else {
                        $cmd = $errors['cmd'];
                    }
                    $email = new Email;
                    if ($errors['ip'] == "" || $errors['port'] == "") {
                        $email->sendEmail("【Сбой сервиса】".$errors['service']."сервис", "Нет доступного сервиса. Команда вызова:".$cmd);
                    } else {
                        $email->sendEmail("【Сбой сервиса】".$errors['service']."сервис", "Адрес сервиса: ".$errors['ip'].":".$errors['port']."Команда вызова:".$cmd);
                    }
                    unset($email);
                }
            });
        });
        return $process;
    }
}
class Email {
    public function sendEmail($title, $body, $format = 'text') {
        $to = Config::get("param::swift.mail.to");
        $host = Config::get("param::swift.mail.host");
        $port = Config::get("param::swift.mail.port");
        $username = Config::get("param::swift.mail.username");
        $password = Config::get("param::swift.mail.password");
        if ($format == "html") {
            $format = 'text/html';
        } else {
            $format = 'text/plain';
        }
        $transport = \Swift_SmtpTransport::newInstance($host, $port)
            ->setUsername($username)
            ->setPassword($password);
        $mailer = \Swift_Mailer::newInstance($transport);
        $email = \Swift_Message::newInstance();
}
``` $email->setSubject($title);
$email->setFrom(array($username => 'clothesmake'));
$email->to($to);
if ($format == 'text/html') {
    $email->body($body, 'text/html');
} else {
    $email->body($body);
}

$res = $mailer->send($email);

if ($res == 1) {
    return true;
}

return false;
}

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/cc_1234-Group-Co.git
git@api.gitlife.ru:oschina-mirror/cc_1234-Group-Co.git
oschina-mirror
cc_1234-Group-Co
cc_1234-Group-Co
master