Уведомление о сбоях в работе сервисов
Здесь используется swiftMail как класс для отправки писем.
composer require swiftmailer/swiftmailer
<?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'],
];
В файле config/dev/listener.php добавляем следующую конфигурацию:
<?php
return [
'services' => [
[
'eventName' => 'kernal.service_fail',
'listener' => 'src\Common\Listeners\ServiceFailListener',
'priority' => 10,
],
]
];
Мы используем 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' => [
'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 )