Файл DetectLostConnectionTrait.php в Cotonti CMF

Файл DetectLostConnectionTrait.php в движке Cotonti CMF реализует трейд, который содержит методы для обнаружения потери соединения с базой данных или сервером. Основное назначение этого трейта — обработка ошибок, связанных с потерей соединения. Он используется для того, чтобы определить, если ошибка, произошедшая в процессе работы с базой данных, связана с потерей соединения, что может потребовать переподключения или других мер по восстановлению.

Основное назначение:

Трейт реализует одну основную функцию:

  • Проверка на потерю соединения: метод isLostConnectionError принимает исключение Throwable (например, PDOException или другое исключение, связанное с базой данных) и проверяет, содержит ли его сообщение информацию о потере соединения с сервером.

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

Задачи и условия, выполняемые кодом:

  1. Проверка ошибок потери соединения: Метод isLostConnectionError анализирует текст ошибки и ищет в нем ключевые фразы, которые могут указывать на потерю соединения. Эти фразы могут быть связаны с такими проблемами, как:

    • Потеря связи с сервером (например, server has gone away, no connection to the server, connection refused).
    • Ошибки сетевой связи (например, network unreachable, Connection timed out, SSL handshake failed).
    • Ошибки базы данных (например, ORA-03114, SQLSTATE[HY000] [2002]).
    • Ошибки соединения при выполнении запросов, такие как Lost connection или server is shutting down.
  2. Механизм обработки ошибок: Если в сообщении ошибки содержится один из заранее заданных текстов (или "needle"), то метод возвращает true, что указывает на потерю соединения. В противном случае возвращается false, и ошибка не считается проблемой потери соединения.

  3. Унификация сообщений об ошибках: Метод приводит сообщение об ошибке к нижнему регистру для более удобного и надежного поиска фраз, независимо от того, в каком регистре они присутствуют в сообщении об ошибке.

Место в системе:

Этот трейт используется в других компонентах фреймворка, которые взаимодействуют с базой данных, например, в классе, который управляет транзакциями. Он позволяет централизованно обработать потерю соединения, чтобы избежать сбоев при работе с базой данных. Например, при обнаружении ошибки потери соединения система может автоматически предпринять попытку переподключиться, продолжить выполнение запроса или выполнить другие восстановительные действия.

Итог:

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

находится по адресу:  /system/database/traits/DetectLostConnectionTrait.php

 

declare(strict_types=1); // Включение строгой типизации для всех переменных в данном файле
namespace cot\database\traits; // Указание пространства имён, в котором находится данный класс или трейт

use Throwable; // Подключение интерфейса Throwable для обработки исключений
trait DetectLostConnectionTrait // Определение трейта DetectLostConnectionTrait, который содержит логику для определения потери соединения
{
    protected function isLostConnectionError(Throwable $e): bool // Защищённый метод для проверки ошибки потери соединения. Принимает объект Throwable
    {
        // Список возможных сообщений об ошибках, указывающих на потерю соединения с сервером
        $needles = [
            'server has gone away', // Сообщение, что сервер недоступен
            'Server has gone away', // Сообщение, что сервер недоступен (вариант с заглавной буквы)
            'no connection to the server', // Нет соединения с сервером
            'Lost connection', // Потеря соединения
            'is dead or not enabled', // Соединение мертво или не включено
            'Error while sending', // Ошибка при отправке
            'decryption failed or bad record mac', // Ошибка дешифрования или плохая контрольная сумма
            'server closed the connection unexpectedly', // Сервер неожиданно закрыл соединение
            'SSL connection has been closed unexpectedly', // SSL-соединение было неожиданно закрыто
            'Error writing data to the connection', // Ошибка записи данных в соединение
            'Resource deadlock avoided', // Избежан взаимный блокировщик ресурсов
            'Transaction() on null', // Ошибка вызова транзакции на null
            'child connection forced to terminate due to client_idle_limit', // Принудительное завершение соединения из-за ограничения по неактивности
            'query_wait_timeout', // Время ожидания запроса истекло
            'reset by peer', // Соединение сброшено другим узлом
            'Physical connection is not usable', // Физическое соединение не пригодно для использования
            'TCP Provider: Error code 0x68', // Ошибка провайдера TCP с кодом 0x68
            'ORA-03114', // Сообщение ошибки базы данных Oracle
            'Packets out of order. Expected', // Пакеты приходят не в том порядке
            'Adaptive Server connection failed', // Соединение с адаптивным сервером не удалось
            'Communication link failure', // Ошибка связи
            'connection is no longer usable', // Соединение больше не пригодно
            'Login timeout expired', // Время ожидания входа истекло
            'SQLSTATE[HY000] [2002] Connection refused', // Ошибка подключения SQL
            'running with the --read-only option so it cannot execute this statement', // Работа в режиме только для чтения
            'The connection is broken and recovery is not possible. The connection is marked by the client driver as unrecoverable. No attempt was made to restore the connection.', // Соединение не восстанавливаемо
            'SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Try again', // Ошибка получения адресов хоста
            'SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name or service not known', // Ошибка получения информации о хосте
            'SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo for', // Ошибка получения информации о хосте
            'SQLSTATE[HY000]: General error: 7 SSL SYSCALL error: EOF detected', // Ошибка SSL при вызове SYSCALL
            'SQLSTATE[HY000] [2002] Connection timed out', // Время подключения истекло
            'SSL: Connection timed out', // Время SSL-соединения истекло
            'SQLSTATE[HY000]: General error: 1105 The last transaction was aborted due to Seamless Scaling. Please retry.', // Ошибка последней транзакции из-за масштабирования
            'Temporary failure in name resolution', // Временная ошибка разрешения имени
            'SSL: Broken pipe', // Ошибка SSL: разорванное соединение
            'SQLSTATE[08S01]: Communication link failure', // Ошибка связи SQLSTATE 08S01
            'SQLSTATE[08006] [7] could not connect to server: Connection refused Is the server running on host', // Ошибка подключения к серверу
            'SQLSTATE[HY000]: General error: 7 SSL SYSCALL error: No route to host', // Ошибка маршрута к хосту при SSL
            'The client was disconnected by the server because of inactivity. See wait_timeout and interactive_timeout for configuring this behavior.', // Отключение клиента сервером из-за неактивности
            'SQLSTATE[08006] [7] could not translate host name', // Ошибка преобразования имени хоста
            'TCP Provider: Error code 0x274C', // Ошибка провайдера TCP с кодом 0x274C
            'SQLSTATE[HY000] [2002] No such file or directory', // Ошибка файла или директории
            'SSL: Operation timed out', // Время операции SSL истекло
            'Reason: Server is in script upgrade mode. Only administrator can connect at this time.', // Причина: сервер в режиме обновления
            'Unknown $curl_error_code: 77', // Неизвестный код ошибки curl
            'SSL: Handshake timed out', // Время рукопожатия SSL истекло
            'SQLSTATE[08006] [7] SSL error: sslv3 alert unexpected message', // Ошибка SSL: неожиданный сигнал
            'SQLSTATE[08006] [7] unrecognized SSL error code:', // Неопознанный код ошибки SSL
            'SQLSTATE[HY000] [2002] No connection could be made because the target machine actively refused it', // Ошибка при подключении к серверу
            'SQLSTATE[HY000] [2002] A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond', // Ошибка при попытке подключения
            'SQLSTATE[HY000] [2002] Network is unreachable', // Сеть недоступна
            'SQLSTATE[HY000] [2002] The requested address is not valid in its context', // Неверный адрес
            'SQLSTATE[HY000] [2002] A socket operation was attempted to an unreachable network', // Ошибка сокета в недоступной сети
            'SQLSTATE[HY000]: General error: 3989', // Ошибка 3989
            'went away', // Сервер ушел
            'No such file or directory', // Нет такого файла или директории
            'server is shutting down', // Сервер выключается
            'failed to connect to', // Ошибка при подключении
        ];

        $haystack = mb_strtolower($e->getMessage()); // Преобразование сообщения об ошибке в нижний регистр для унификации поиска

        foreach ($needles as $needle) { // Процесс поиска каждого элемента в списке ошибок
            if (mb_stripos($haystack, $needle) !== null) { // Если сообщение ошибки содержит один из элементов из списка
                return true; // Возвращаем true, если ошибка указывает на потерю соединения
            }
        }

        return false; // Если ошибка не соответствует ни одному из условий, возвращаем false
    }
}

 

7 минут чтения Administrator

Комментарии (0)

Комментарии отсутствуют
Добавление комментариев доступно только зарегистрированным пользователям

Автор контента

Administrator

Оффлайн

Administrator

Последняя авторизация: 05.07.2026 18:32

  • Страница размещена: 28.01.2025 03:03
  • Последнее обновление: 28.01.2025 03:03