Как исправить ошибку «MySQL server has gone away» на PHP-сайте
Как исправить ошибку «MySQL server has gone away» на PHP-сайте
Ошибка MySQL server has gone away — одна из самых распространённых проблем при работе с базами данных на PHP-сайтах. Она возникает внезапно, особенно при выполнении длительных операций или загрузке больших файлов. В этой статье вы узнаете причины ошибки и рабочие способы её устранения — даже если вы используете MySQL версии ниже 8.0.29.
Основные причины ошибки
Сервер MySQL разрывает соединение по одной из следующих причин:
- Превышен лимит времени ожидания (
wait_timeoutилиinteractive_timeout). - Размер запроса превышает лимит (
max_allowed_packet). - Сервер MySQL был перезапущен во время работы скрипта.
- Нехватка памяти или аварийное завершение процесса 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: Оптимизируйте запросы
- Разбивайте большие INSERT на части по 1000 строк.
- Избегайте передачи огромных текстов или файлов через SQL.
- Используйте подготовленные выражения (
prepared statements) для массовых операций.
Дополнительно: проверьте логи MySQL
Логи помогут точно определить причину. Найдите файл error.log (часто в /var/log/mysql/) и ищите строки вроде:
[Note] Aborted connection ... due to timeout
Заключение
Ошибка MySQL server has gone away легко решается, если знать её корень. Чаще всего проблема — в настройках таймаута или размера пакета. Обновлять MySQL до 8.0+ не обязательно: все методы работают и на старых версиях, включая те, что используются на большинстве российских хостингов.
Настройте сервер правильно — и ваши скрипты перестанут «терять» базу данных!