Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Добрый день.
Не могу понять из-за чего валится скрипт. Мне надо вытянуть данные из базы данных (очень большой). Тянется по крону ночью. Делал всё по гайду Laravel 12. Вот тут отваливается скрипт.
$tempnzWorkers = DB::connection('old_db')->select('SELECT `w`.`id`, `workdate`, `u`.`id` AS `user_id`, `workday`, `worknight`, `rate` FROM `tempnz_workers` AS `w` INNER JOIN `sysusers` AS `u` ON `u`.`tabnumber` = `w`.`tabnumber` INNER JOIN `rates` AS `r` ON `w`.`rate` = `r`.`id`;');
Таблица 3 318 635 строк. 5.2GB. Причём если указать фильтр по году (есть такой столбец), то отрабатывает. Но мне нужна вся таблица. Просто вылетает скрипт, ничего не пишет. Логов нет. Просто не понимаю чего не хватает. Если этот же запрос запустить через консоль, HeidiSql - за полчаса отрабатывает. Долго конечно, но хотя-бы...
Какая методика поиска ошибки?
Не в сети
";" в конце запроса не нужен (хоть это и не ошибка).
Просто вылетает скрипт, ничего не пишет. Логов нет.
Какие-то записи в логе веб-сервера должны быть, если, конечно, логгирование полностью не отключено, что вряд ли. Либо дело в памяти (memory_limit), либо в таймауте (max_execution_time, можно отключить через set_time_limit(0)). Для начала советую сделать пустой скрипт и в нем только выполнить этот запрос через PDO (напрямую). Также можно попробовать поднять memory_limit и max_execution_time.
Не в сети
; в конце просто потому что таких запросов несколько. И вообщем ни на что не влияют. Через PDO тоже валится. Помогло только
set_time_limit(60 * 60 * 24);
ini_set('memory_limit', '5G');
в начале файла.
Не в сети
Ещё момент обнаружил. Скрипт может отвалиться внезапно, сессия рвётся. И помогает повторный запуск скрипта вручную. Как можно отследить это? Если сессия отвалилась, то повторный раз запустить. Обернуть в try catch?
Не в сети
Скрипт может отвалиться внезапно, сессия рвётся.
Какая сессия?
Обернуть в try catch?
Для начала все-таки найти в логах сообщение, из-за чего скрипт перестает выполняться. В крайнем случае, включить все display_errors, error_reporting и т.д.
Если речь о том, что скрипт вызывается из браузера (по запросу на веб-сервер) и этот запрос рвется, тогда достаточно включить ignore_user_abort().
Не в сети
А можно же отслеживать скрипт, если завершился неудачей, запускать повторно его. Правда он может сутки работать.
Не в сети
Из консоли он вызывается, Планирование задач есть такой раздел.
Не в сети
SQLSTATE[HY000]: General error: 2006 MySQL server has gone away
Вот что пишет.
Не в сети
SQLSTATE[HY000]: General error: 2006 MySQL server has gone away
Вот, что ответил Copilot . Он правда не всегда прав , но если его довести до белого кaления, можно добиться результатов.
Конечно! Ошибка SQLSTATE[HY000]: General error: 2006 MySQL server has gone away обычно возникает, когда сервер MySQL неожиданно закрывает соединение. Вот возможные причины и способы их устранения:
- Увеличьте max_allowed_packet: Если запрос содержит большие данные, попробуйте увеличить этот параметр в конфигурации MySQL (my.cnf или my.ini).
- Настройте wait_timeout: Если сервер закрывает неактивные соединения слишком быстро, увеличьте значение wait_timeout в конфигурации MySQL.
- Проверьте стабильность сети: Нестабильное подключение может привести к неожиданному обрыву соединения.
- Проверьте настройки базы данных: Убедитесь, что в файле .env Laravel указаны правильные хост, порт и учетные данные.
- Включите авто-подключение: Некоторые клиенты MySQL поддерживают автоматическое восстановление соединения при его потере.
Попробуйте эти решения и сообщите, если потребуется дополнительная помощь!
Изменено DzonyBB (11.06.2025 22:32:02)
Не в сети
В Laravel можно настроить автоматическое восстановление соединения с MySQL несколькими способами:
- Использование PDO::ATTR_PERSISTENT
В файле config/database.php добавьте параметр PDO::ATTR_PERSISTENT в настройки MySQL:
- Это позволит Laravel повторно использовать соединение, вместо создания нового.
- Обработка ошибок соединения
В коде можно перехватывать ошибки соединения и повторять запрос:
use Illuminate\Database\QueryException;
try {
// Ваш запрос к базе данных
} catch (QueryException $e) {
if ($e->getCode() === 'HY000') {
// Повторное подключение
DB::reconnect();
}
}
- Использование Laravel Retry Helper
Laravel предоставляет удобный способ повторного выполнения запроса:
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Retry;
Retry::times(3)->catch(function () {
DB::reconnect();
})->run(function () {
// Ваш запрос
});
Это тоже Copilot. Мож поможет.
Не в сети
Спасибо. Буду пробовать. А
Illuminate\Support\Facades\Retry
в api я не нашёл. По крайней мере для 12 версии.
Не в сети
в api я не нашёл. По крайней мере для 12 версии.
Посмотрите здесь https://laravel.com/docs/12.x/helpers#method-retry
Не в сети
Страницы 1