Команда Laravel выпустила версию 13.40.0, в которой появились обратные вызовы (callbacks) для задач очереди и запланированных задач, выполняющихся слишком долго, ID коммитов для проверки того, получил ли реплика чтения запись, insertBefore() и insertAfter() для стека middleware, флаг strict в помощниках ввода запроса, а также исправление безопасности для драйвера процесса Concurrency .
-
Queue::whenJobRunsLongerThan()иSchedule::whenTaskRunsLongerThan() -
DB::getLastCommitId()иDB::hasCommitId()для реплик чтения - Вставка middleware до или после встроенного middleware
- Флаг
strictдляinteger(),float(),boolean()иstring() - Подписанный вывод результата для
Concurrency::run()с драйвером процесса - Исправления транзакций при потере соединений и таймаутах ожидания блокировки
#Оповещения о долго выполняющихся задачах и запланированных задачах
Джек Бэйлисс добавил Queue::whenJobRunsLongerThan() , который запускает обратный вызов, если попытка выполнения задачи занимает больше времени, чем заданный порог. В Laravel уже есть DB::whenQueryingForLongerThan() и аналогичные методы для запросов и команд, но их не было для задач в очереди:
use Carbon\CarbonInterval; use Illuminate\Support\Facades\Queue; Queue::whenJobRunsLongerThan(CarbonInterval::seconds(90), function ($job, $duration) { Log::warning("{$job->resolveName()} took {$duration}ms"); });
Обратный вызов прослушивает событие JobAttempted , поэтому он также срабатывает для попыток, которые завершились неудачей или были возвращены в очередь. Обычное число считывается как миллисекунды, и длительность, передаваемая в обратный вызов, также указывается в миллисекундах.
Второй PR добавляет Schedule::whenTaskRunsLongerThan() для запланированных задач. Он запускается после завершения или сбоя задачи, и здесь обычное число считывается как секунды:
use Carbon\CarbonInterval; use Illuminate\Console\Scheduling\Event; use Illuminate\Support\Facades\Schedule; Schedule::whenTaskRunsLongerThan(CarbonInterval::minutes(45), function (Event $task, float $runtime) { Log::warning("Scheduled task [{$task->getSummaryForDisplay()}] took {$runtime}s"); });
Подробности см. в #62141 и #62233.
#ID коммитов для реплик чтения
Тобиас Петри добавил методы, которые позволяют узнать, получила ли реплика чтения конкретную запись. В Laravel 13.38 был добавлен middleware PreventStaleDatabaseReads, который направляет запросы на чтение на сервер записи в течение фиксированного времени после записи. С помощью ID коммитов вы можете проверять реплику, вместо того чтобы гадать, какова задержка:
use Illuminate\Support\Facades\DB; // After a write, on the primary $order = $user->orders()->create($attributes); $commitId = DB::getLastCommitId(); // Later, on a replica DB::hasCommitId($commitId); // Check now DB::hasCommitId($commitId, wait: 2); // Wait up to two seconds
Метод mergeCommitIds() объединяет несколько ID коммитов в один, чтобы вы могли дождаться их всех сразу. Эти методы работают в MySQL с включенными GTID, MariaDB с включенным бинарным логом и PostgreSQL. Ожидание в PostgreSQL требует версии PostgreSQL 19. Другие драйверы выбрасывают RuntimeException .
Подробности см. в #62198.
#Вставка middleware до или после встроенного middleware
Джейми Йорк добавил insertBefore() и insertAfter() в конфигурацию middleware в bootstrap/app.php . Раньше для запуска вашего middleware сразу после одного из стандартных middleware Laravel приходилось объявлять стек самостоятельно:
->withMiddleware(function (Middleware $middleware) { $middleware->insertAfter(TrustProxies::class, StripCrossOriginReferer::class); $middleware->insertBefore(TrimStrings::class, SanitizeStrings::class); })
Методы insertBeforeInGroup() и insertAfterInGroup() делают то же самое для группы middleware, такой как web . Более ранний PR в этом релизе также позволяет replace() и replaceInGroup() принимать массив, что и используют новые методы.
Подробности см. в #62230 и #62261.
#Строгое приведение типов ввода
Крис Моррелл добавил аргумент strict в методы string() , str() , boolean() , integer() и float() в запросах и других классах, использующих трейт InteractsWithData . Без него ?count=abc123 приводится к 0 , а массив, такой как ?name[]=chris , вызывает ошибку "Array to string conversion". Если установлен strict , недопустимые значения возвращают значение по умолчанию:
// ?count=abc123 $request->integer('count', 5); // 0 $request->integer('count', 5, strict: true); // 5
В строгом режиме boolean() принимает только 1 , true , on , yes , 0 , false , off и no .
Подробности см. в #62254.
#Исправление безопасности драйвера процесса Concurrency
Этот релиз исправляет проблему удаленного выполнения кода в Concurrency::run() с драйвером по умолчанию process , о которой сообщил @Arr0way. Родительский процесс считывал результат задачи из вывода дочернего процесса и десериализовал его. Задача, которая выводила контролируемый пользователем текст, могла записать поддельный результат, который затем десериализовался родительским процессом.
Теперь дочерний процесс записывает свой результат в кадр, подписанный случайным ключом, который родитель создает для каждой задачи. Родитель игнорирует любой кадр, который не проходит проверку ключом. Исправление также устраняет ошибку "Trying to access array offset on null", которая могла возникать, если задача выводила какие-либо данные. Если ваше приложение использует Concurrency::run() с драйвером процесса, обновитесь до 13.40.0.
Подробности см. в #62297.
#Исправления транзакций базы данных
Володя Куршудян исправил две проблемы с транзакциями:
- При разрыве соединения внутри транзакции Laravel теперь отбрасывает нерабочий PDO и переподключается при следующем запросе. Раньше старый PDO все еще имел открытую транзакцию, и каждая последующая транзакция завершалась ошибкой "There is already an active transaction", пока не перезапускался воркер очереди или процесс Octane (#62211)
- Таймаут ожидания блокировки или взаимоблокировка (deadlock) во вложенной транзакции теперь откатываются к точке сохранения (savepoint) этой транзакции. Раньше вложенные записи фиксировались (commit), если внешняя транзакция перехватывала исключение (#62248)
#Вывод планировщика и воркера очереди
Джек Бэйлисс также внес два изменения в то, что сообщают планировщик и воркер очереди:
- Планировщик теперь отправляет
ScheduledTaskSkipped, когда задачаonOneServer()уже была выполнена на другом сервере (#62256) - Команда
queue:workпоказываетRELEASEDвместоDONEдля задач, возвращенных в очередь, например, с помощью middlewareWithoutOverlappingилиRateLimited(#62180)
#Примечания к выпуску
Полный список новых функций и обновлений вы можете увидеть ниже, а также diff между 13.39.0 и 13.40.0 на GitHub. Следующие примечания к выпуску взяты непосредственно из changelog:
#v13.40.0
- [13.x] Исправлен тип возвращаемого значения Paginator::links() от @dhrupo в #62226
- [13.x] Исправлено обновление JSON-путей с массивами и коллекциями в MySQL и MariaDB от @xurshudyan в #62225
- [13.x] Использование соединения для записи в поиске BelongsToMany createOrFirst от @xurshudyan в #62223
- [13.x] Удаление ограничений check при удалении столбцов в SQL Server от @xurshudyan в #62222
- [13.x] Централизация + улучшение тестов для
InteractsWithDataот @inxilpro в #62217 - [13.x] Исправлена блокировка Redis при очистке тегированного кэша с большим количеством тегов от @MohannadElemary в #62215
- [13.x] Квалификация удаленных и переименованных индексов схемой таблицы в PostgreSQL от @xurshudyan в #62213
- [13.x] Переподключение после потери соединения во время транзакции от @xurshudyan в #62211
- [13.x] Добавлены отсутствующие языки полнотекстового поиска PostgreSQL от @xurshudyan в #62210
- [13.x] Добавлен Queue::whenJobRunsLongerThan от @jackbayliss в #62141
- [13.x] Исправлены именованные аргументы в Cookie::queue() от @xurshudyan в #62246
- [13.x] Исправлен ImageFile::default(), возвращавший простое правило File от @Marzaan в #62244
- [13.x] Исправлен тип возвращаемого значения render() в контрактах пагинации от @dhrupo в #62242
- [13.x] Исправлено игнорирование orderBy в SQL Server при обновлении и удалении с limit от @xurshudyan в #62239
- [13.x] Сохранение error_get_last() для подавленных ошибок от @xurshudyan в #62228
- Подготовка переиспользуемых сред разработки для Amp orbs от @DGarbs51 в #62231
- Разрешить
$middleware->replace()принимать массив замен от @ziadoz в #62230 - [13.x] Отображение возвращенных задач как "released" в выводе queue:work от @jackbayliss в #62180
- Добавлены вспомогательные методы
$middleware->insertBefore()и$middleware->insertAfter()от @ziadoz в #62261 - [13.x] Переподключение сокета Cloud log после неудачной записи от @jamesdangercarpenter в #62258
- [13.x] Отправка
ScheduledTaskSkipped, когда задача уже была выполнена на другом сервере от @jackbayliss в #62256 - [13.x] Исправлена генерация невалидного SQL для forceIndex() в SQLite для PRIMARY и нескольких индексов от @tharlei в #62255
- [13.x] Добавлен Schedule::whenTaskRunsLongerThan от @jackbayliss в #62233
- [13.x] Откат к savepoint при ошибках конкурентности во вложенных транзакциях от @xurshudyan в #62248
- [13.x] Исправлен
toResourceCollection()в отфильтрованных коллекциях от @xurshudyan в #62266 - Исправлено освобождение лениво загружаемых изображений только при сборке мусора от @tamc в #62265
- Обновление stefanzweifel/git-auto-commit-action с 7.2.0 до 7.2.1 в группе github-actions от @dependabot[bot] в #62288
- KeyGenerateCommand: улучшение сообщения справки о '--show' от @valerio-bozzolan в #62286
- [13.x] Запись неудачных пакетных задач при отсутствии модели от @xurshudyan в #62280
- [13.x] Исправлено вещание на несколько зашифрованных каналов Pusher от @xurshudyan в #62279
- [13.x] Исправлен отказ Str::remove() принимать Traversable subject от @Amirhf1 в #62278
- [13.x] Исправлена обработка offset и length как байтов в Str::substrCount() от @Amirhf1 в #62277
- [13.x] Исправлены
withExists()иloadExists()в SQL Server от @xurshudyan в #62273 - [13.x] Исправлены
cursorPaginate()столбцы в union-запросах с несколькими сортировками от @xurshudyan в #62272 - [13.x] Исправлены типы @param, более широкие, чем нативный тип параметра, от @dhrupo в #62271
- [13.x] Определение QueryList.TerminateAll() как потеря соединения от @jackbayliss в #62270
- [13.x] Добавлен флаг
strictвInteractsWithDataот @inxilpro в #62254 - [13.x] Основы базы данных для определения того, догнало ли соединение для чтения соединение для записи, от @tpetry в #62198
- [13.x] Исправлен CommandSignatureTest от @jackbayliss в #62295
- [13.x] Исправлено оборачивание простых объектов коллекциями ресурсов JSON:API от @lazerg в #62299
- [13.x] Исправление: Аутентификация конверта результата процесса Concurrency для предотвращения инъекции вывода задачи от @Arr0way в #62297
Комментарии (0)
Пока нет комментариев — будьте первым.