Как исправить ошибку «MySQL server has gone away» на PHP-сайте

1
онлайн
1
сегодня
Опубликовано: 27.01.2026 • Просмотров: 4
Как исправить ошибку «MySQL server has gone away» на PHP-сайте

Как исправить ошибку «MySQL server has gone away» на PHP-сайте

Ошибка MySQL server has gone away — одна из самых распространённых проблем при работе с базами данных на PHP-сайтах. Она возникает внезапно, особенно при выполнении длительных операций или загрузке больших файлов. В этой статье вы узнаете причины ошибки и рабочие способы её устранения — даже если вы используете MySQL версии ниже 8.0.29.

Основные причины ошибки

Сервер MySQL разрывает соединение по одной из следующих причин:

  1. Превышен лимит времени ожидания (wait_timeout или interactive_timeout).
  2. Размер запроса превышает лимит (max_allowed_packet).
  3. Сервер MySQL был перезапущен во время работы скрипта.
  4. Нехватка памяти или аварийное завершение процесса mysqld.

Способ 1: Увеличьте wait_timeout и interactive_timeout

По умолчанию wait_timeout часто установлен в 30–60 секунд. Если ваш скрипт выполняется дольше (например, парсинг или миграция), соединение обрывается.

Чтобы увеличить лимит, добавьте в файл конфигурации MySQL (my.cnf или my.ini):

[mysqld]
wait_timeout = 300
interactive_timeout = 300

После изменения перезапустите MySQL:

sudo systemctl restart mysql
💡 Совет: если у вас нет доступа к my.cnf (например, на shared-хостинге), попробуйте установить параметры через SQL-запрос: SET SESSION wait_timeout = 300;

Способ 2: Увеличьте max_allowed_packet

Если вы отправляете большой INSERT или загружаете BLOB-данные, может сработать ограничение max_allowed_packet (по умолчанию — 4–16 МБ).

Добавьте в my.cnf:

[mysqld]
max_allowed_packet = 64M

Также убедитесь, что клиентская часть (PHP) согласована:

// Проверить текущее значение
SHOW VARIABLES LIKE 'max_allowed_packet';

Способ 3: Переподключайтесь к базе в долгих скриптах

Если вы не можете изменить настройки сервера, добавьте в PHP-код проверку и переподключение:

<?php
function safeQuery($connection, $sql) {
    if (!mysqli_ping($connection)) {
        // Переподключаемся
        $connection = new mysqli($host, $user, $pass, $db);
    }
    return mysqli_query($connection, $sql);
}
?>

Функция mysqli_ping() проверяет активность соединения и позволяет восстановить его при разрыве.

Способ 4: Оптимизируйте запросы

Дополнительно: проверьте логи MySQL

Логи помогут точно определить причину. Найдите файл error.log (часто в /var/log/mysql/) и ищите строки вроде:

[Note] Aborted connection ... due to timeout

Заключение

Ошибка MySQL server has gone away легко решается, если знать её корень. Чаще всего проблема — в настройках таймаута или размера пакета. Обновлять MySQL до 8.0+ не обязательно: все методы работают и на старых версиях, включая те, что используются на большинстве российских хостингов.

Настройте сервер правильно — и ваши скрипты перестанут «терять» базу данных!

👍 0👎 0

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

Оставить комментарий

Вам также может быть полезно