/
v.bolshakov
/
AIEcosystem-Testing
Обзор
Документация
Войти
/
v.bolshakov
/
AIEcosystem-Testing
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
dev
common/components/DeduplicatedEmailTarget.php
66 строк
2 KB
Developer
Initial commit
03 авг 2026, 17:43
03 авг 2026, 17:43
7433917
Код
Авторство
О чём код?
<?php namespace common\components; use yii\helpers\VarDumper; use yii\log\Logger; use Yii; class DeduplicatedEmailTarget extends \yii\log\EmailTarget { /** * @var int минимальный интервал между отправками для одинаковых ошибок (в секундах) */ public $minInterval = 300; public function export() { // Проверяем, не отправляли ли мы уже такое же сообщение недавно if ($this->isDuplicate()) { return; // Пропускаем отправку } // Родительская логика отправки письма parent::export(); } protected function isDuplicate() { $lockFile = Yii::getAlias('@common/runtime/yii_email_error.lock'); $lastMessage = @file_get_contents($lockFile); // Форматируем текущее сообщение так же, как и для отправки $currentMessage = $this->formatCurrentMessage(); // Проверяем, совпадает ли сообщение и не истек ли интервал if ($currentMessage === $lastMessage && @filemtime($lockFile) > strtotime('-' . $this->minInterval . ' seconds')) { return true; } // Сохраняем новое сообщение в файл-замок @file_put_contents($lockFile, $currentMessage, LOCK_EX); return false; } protected function formatCurrentMessage() { // Берем первое сообщение из пачки $message = reset($this->messages); list($text, $level, $category, $timestamp) = $message; $level = Logger::getLevelName($level); if (!is_string($text)) { if ($text instanceof \Throwable || $text instanceof \Exception) { // Для исключений берем только сообщение, файл и строку для обобщения $text = "\n--------------------------\n" . $text->getMessage() . ' in ' . $text->getFile() . ':' . $text->getLine() . "\n--------------------------\n"; } else { $text = VarDumper::export($text); } } $prefix = $this->getMessagePrefix($message); return "[$category] $text"; } }