У Laravel v13.10.0 з'явився драйвер кешу storage на базі абстракції файлової системи. Це дозволяє використовувати S3 (або будь-який інший диск) як сховище ключ/значення без встановлення додаткових пакетів. Також оновлення додає опцію --stop-when-empty-for для воркерів черг, подію WorkerIdle, колбеки життєвого циклу для груп розкладу, метод Schema::hasForeignKey() та низку покращень для тестування черг.
- Новий драйвер кешу
storageна базі файлової системи Laravel - Опція
--stop-when-empty-forдля воркерів черг - Подія
WorkerIdleдля виявлення бездіяльних воркерів - Колбеки життєвого циклу та виводу в
Schedule::group() - Хелпер
Schema::hasForeignKey() - Вивід
queue:failed --jsonу форматі JSON - Хелпер для тестів
assertPushedOnce() - Підтримка Enum для назв черг у
QueueFake - Передача
WorkerOptionsу додаткові події воркера
# Що нового
# Драйвер кешу Storage
Новий драйвер storage використовує сервіси файлової системи Laravel для зберігання закешованих значень. Це передусім корисно для використання S3 як сховища ключ/значення — тепер Redis або Memcached не є обов'язковими.
У стандартний конфіг config/cache.php додано запис для storage:
'storage' => [
'driver' => 'storage',
'disk' => env('CACHE_STORAGE_DISK'),
'path' => env('CACHE_STORAGE_PATH', 'framework/cache/data'),
],
Вкажіть будь-який диск (наприклад, s3) у CACHE_STORAGE_DISK, і драйвер буде записувати дані через рівень файлової системи Laravel. Кожне значення зберігається як файл із серіалізованим корисним навантаженням та міткою часу закінчення терміну дії.
PR: #60131 від @taylorotwell
# Автозупинка воркера при бездіяльності
Команда queue:work тепер підтримує опцію --stop-when-empty-for. Вона зупиняє воркер, якщо він не обробив жодного завдання протягом вказаної кількості секунд:
php artisan queue:work --stop-when-empty-for=60
Це зручно для середовищ, що масштабуються, або короткочасних процесів, коли воркери мають завершувати роботу автоматично, якщо черга порожня.
PR: #60176 від @taylorotwell
# Подія бездіяльності воркера
Нова подія WorkerIdle спрацьовує, коли воркер перевіряє чергу і не знаходить завдань. На відміну від JobPopping, яка активується при кожній спробі отримати завдання, WorkerIdle дозволяє точно відстежувати простій для перерозподілу потужностей або логування.
PR: #60134 від @jackbayliss
# Конфігурація воркера в подіях
Об'єкт WorkerOptions (що містить прапорець --name та інші налаштування) тепер передається в події Pausing, Resuming, Interrupted та Looping. Раніше було складно ідентифікувати, який саме екземпляр воркера викликав подію.
PRs: #60135, #60153 від @jackbayliss
# Колбеки життєвого циклу для груп розкладу
Метод Schedule::group() тепер підтримує ті самі колбеки, що й окремі завдання. Це дозволяє налаштувати логіку для всієї групи одразу:
Schedule::group(function (Schedule $schedule) {
$schedule->command('reports:generate');
$schedule->command('reports:email');
})->onFailure(function () {
// спрацьовує при помилці будь-якого завдання в групі
})->onSuccess(function () {
// спрацьовує при успішному виконанні кожного завдання групи
});
PR: #60133 від @cosmastech
# Доступ до екземпляра Event у колбеках
Колбеки запланованих завдань (onSuccess, onFailure, then) тепер можуть приймати екземпляр Event. Це дає прямий доступ до конфігурації завдання: команди, шляху до логів тощо:
$schedule->command('reports:generate')
->onFailure(function (Event $event) {
Log::error("Заплановане завдання не виконано: {$event->command}");
});
PR: #60144 від @cosmastech
# Перевірка існування зовнішнього ключа
Новий метод Schema::hasForeignKey() дозволяє перевірити наявність обмеження зовнішнього ключа в таблиці. Це доповнює існуючі хелпери getForeignKeys() та hasIndex():
if (! Schema::hasForeignKey('orders', ['user_id'])) {
Schema::table('orders', function (Blueprint $table) {
$table->foreign('user_id')->references('id')->on('users');
});
}
PR: #60169 від @Tresor-Kasenda
# JSON-вивід для помилок черги
Команда queue:failed отримала прапорець --json. Кожен запис містить id, connection, queue, class та failed_at. Це уніфікує роботу з CLI-інструментами Laravel, такими як route:list або queue:monitor.
PR: #60168 від @Tresor-Kasenda
# Очищення переповнення SQS при очищенні черги
Розширене сховище SQS (додане у 13.9.0) тепер підтримує опцію flush_on_clear. Якщо вона увімкнена, виконання queue:clear також викличе flush() для пов'язаного кешу переповнення. Це важливо для S3-сховищ, щоб не платити за залишкові об'єкти:
'sqs' => [
// ...
'extended_store_options' => [
'enabled' => true,
'disk' => 's3',
'flush_on_clear' => true,
],
],
# Перевірка на поодиноке завдання в черзі
Queue::assertPushedOnce() — це лаконічна альтернатива Queue::assertPushedTimes(JobClass::class, 1):
// Раніше
Queue::assertPushedTimes(ProcessOrderJob::class, 1);
// Тепер
Queue::assertPushedOnce(ProcessOrderJob::class);
PR: #60150 від @weshooper
# Enum для назв черг у тестах
QueueFake тепер нормалізує назви черг у форматі Enum так само як і основний драйвер. Використання UnitEnum у push(), size() або pendingJobs() тепер працює коректно.
PR: #60161 від @Tresor-Kasenda
# Request ID у логах Laravel Cloud
Для застосунків у Laravel Cloud ідентифікатор запиту тепер виводиться у логах як окреме поле JSON, а не вкладене в context або extra блоки Monolog.
PR: #60156 від @jradtilbrook
# Різні виправлення та покращення
- Виправлено валідацію
starts_with/ends_with— тепер правила коректно обробляють числові значення, як у Laravel 12 (#60120). - Кодування шляхів у підписаних URL — шляхи сховища тепер кодуються перед додаванням у сегменти підписаних маршрутів, що виправляє проблеми з символами
?,&та#(#60137). - Екранування аліасів агрегатів — аліаси SQL-функцій тепер екрануються для запобігання конфліктам із зарезервованими словами (#60140).
- Оптимізація перевірки пауз воркера — процес перевірки став ефективнішим (#60109).
- Валідація Email на переноси рядків — валідація пошти тепер відхиляє адреси з переносом рядка (#60151).
Джерела: