Уведомления — это как нервная система вашего приложения. Без них пользователи не узнают о новых сообщениях, заказах или событиях. В этой статье мы разберём, как построить надёжную систему уведомлений на PHP, начиная с простых email и заканчивая многоканальными оповещениями.

Digital-студия WNDER

Зачем вообще нужна система уведомлений?

Представьте интернет-магазин. Клиент оформил заказ. Если он не получит подтверждение на почту или в мессенджер, он будет нервничать и звонить в поддержку. Уведомления экономят время и нервы. Они бывают разных типов: email, SMS, push, сообщения в Telegram или Slack. В PHP можно реализовать всё это, используя сторонние библиотеки или собственные скрипты.

Главная задача — не просто отправить сообщение, а сделать это надёжно, с возможностью повторной отправки при сбое, логированием и гибкой настройкой каналов.

Простой email-уведомитель на PHP

Начнём с базы — отправка email через встроенную функцию mail(). Она проста, но имеет ограничения: часто попадает в спам, не поддерживает SMTP-аутентификацию. Лучше использовать библиотеку PHPMailer или Symfony Mailer. Но для примера покажу базовый вариант.

Ваш заказ принят');
?>

Этот код отправит HTML-письмо. Но чтобы не попасть в спам, нужен SMTP. Вот пример с PHPMailer (устанавливается через Composer):

isSMTP();
        $mail->Host = 'smtp.example.com';
        $mail->SMTPAuth = true;
        $mail->Username = 'user@example.com';
        $mail->Password = 'secret';
        $mail->SMTPSecure = 'tls';
        $mail->Port = 587;
        $mail->setFrom('noreply@example.com', 'My App');
        $mail->addAddress($to);
        $mail->isHTML(true);
        $mail->Subject = $subject;
        $mail->Body = $body;
        $mail->send();
        return true;
    } catch (Exception $e) {
        error_log("Ошибка отправки: {$mail->ErrorInfo}");
        return false;
    }
}
?>

Такой подход надёжнее. Но что, если нужно отправлять уведомления не только на email?

Многоканальная система: архитектура и примеры

Чтобы не писать кучу if-else для каждого канала, используем паттерн «Стратегия». Создадим интерфейс NotificationChannel и реализации для email, SMS, Telegram.

botToken = $token;
    }
    public function send(string $recipient, string $subject, string $message): bool {
        $url = "https://api.telegram.org/bot{$this->botToken}/sendMessage";
        $data = ['chat_id' => $recipient, 'text' => $message];
        $options = ['http' => ['method' => 'POST', 'header' => "Content-Type: application/json\r\n", 'content' => json_encode($data)]];
        $context = stream_context_create($options);
        $result = file_get_contents($url, false, $context);
        return $result !== false;
    }
}
?>

Теперь можно легко добавлять новые каналы, не меняя основной код. Например, SMS через Twilio или push через Firebase.

Правило: Всегда логируйте отправку уведомлений. Это поможет отследить ошибки и понять, дошло ли сообщение до пользователя.

Очереди и отложенная отправка

Если у вас тысячи пользователей, отправлять уведомления синхронно — плохая идея. Сервер будет тормозить. На помощь приходят очереди: Redis, RabbitMQ, Beanstalkd. В PHP есть библиотеки для работы с ними, например, php-resque или enqueue.

Простой пример с Redis и библиотекой Predis:

lpush('notifications', json_encode([
    'channel' => 'email',
    'to' => 'user@example.com',
    'subject' => 'Привет',
    'message' => 'Это тестовое уведомление'
]));
?>

А воркер (отдельный скрипт) будет разбирать очередь и отправлять:

brpop('notifications', 30);
    if ($job) {
        $data = json_decode($job[1], true);
        // отправка через нужный канал
    }
}
?>

Такой подход позволяет масштабироваться и не терять уведомления при пиковых нагрузках.

Сравнение популярных библиотек для уведомлений

Чтобы не изобретать велосипед, можно взять готовые решения. Вот таблица сравнения.

Библиотека Поддерживаемые каналы Сложность Особенности
PHPMailer Email Низкая Простой, но только email
Symfony Notifier Email, SMS, Slack, Telegram, браузер Средняя Гибкий, требует Symfony
Laravel Notifications Email, SMS, Slack, база данных Низкая (если используете Laravel) Встроено в фреймворк
Notificator Email, SMS, push Средняя Легковесная, но меньше каналов

Выбирайте под свои задачи. Если проект на Laravel — берите встроенные уведомления. Если нужна гибкость — Symfony Notifier.

Лайфхак: Для тестирования уведомлений используйте Mailtrap или аналогичные сервисы. Они перехватывают письма и не спамят реальных пользователей.

Обработка ошибок и повторные попытки

Никто не застрахован от сбоев: SMTP-сервер упал, Telegram API вернул ошибку. Нужно уметь повторять отправку. Простой механизм — сохранять неудачные попытки в базу и периодически пробовать снова.

Пример функции с тремя попытками:

send($to, $subject, $message)) {
            return true;
        }
        $attempt++;
        sleep(2); // пауза перед повтором
    }
    // логируем окончательную неудачу
    error_log("Не удалось отправить уведомление после {$maxAttempts} попыток");
    return false;
}
?>

Для продакшена лучше использовать готовые решения вроде retry из Laravel или библиотеку PHP Retry.

Что в итоге?

Создание системы уведомлений на PHP — задача, которая решается поэтапно. Начните с простого email, затем добавьте другие каналы через паттерн «Стратегия». Не забывайте про очереди для масштабирования и логирование для отладки. Готовые библиотеки экономят время, но понимание внутренней кухни помогает кастомизировать под себя.

Главное — не переусложняйте. Если у вас 10 пользователей, не нужен RabbitMQ. Если 10 миллионов — без очередей не обойтись. Выбирайте инструмент под задачу.

Студия WNDER