Увійти Реєстрація
Вакансії
Вакансії Laravel Компанії Статистика
Підготовка
Як підготуватися < href="https://laravelukraine.com/interviews" wire:navigate.hover class="flex items-center gap-3 rounded-md px-3 py-2 text-base font-medium text-gray-600 hover:bg-gray-50 hover:text-gray-900 dark:text-gray-400 dark:hover:bg-gray-900 dark:hover:text-white" >Співбесіди Тестування Документація
Блог
Всі статті Серії
Екосистема
Пакети Ресурси Проєкти Інструменти Події Відео
Інше
Про нас Реклама
Новини 26 вересня 2026

Мемоізація читання тегованого кешу в Laravel

Мемоізований кеш Laravel, Cache::memo(), зчитує ключ із вашого кеш-сховища один раз і обслуговує його з пам'яті протягом решти запиту або задачі. Починаючи з Laravel 13.33, він також працює з тегами кешу, тому тепер можна мемоізувати теговані значення за допомогою Cache::memo()->tags().

Це особливо корисно, коли один запит багато разів зчитує одне й те саме теговане значення. Наприклад, перевірка прав доступу може виконуватися для кожного виклику can() і кожної директиви @can у представленні. Без мемоізації кожна така операція знову звертається до кеш-сховища.

Мемоізація тегованого пошуку

Викличте метод tags() на мемоізованому кеші й використовуйте його як будь-який інший тегований кеш:

use Illuminate\Support\Facades\Cache;

public function getPermissions(User $user): Collection
{
    return Cache::memo()
        ->tags(['permissions', "user:{$user->id}"])
        ->remember(
            "permissions:{$user->id}",
            now()->addHour(),
            fn () => $this->loadPermissionsFromDatabase($user)
        );
}

Перший виклик у запиті зчитує дані з кеш-сховища або виконує замикання у разі промаху кешу. Наступні виклики з тими самими тегами та ключем повертають значення безпосередньо з пам'яті.

До того, як мемоізований кеш отримав підтримку тегів, розробникам доводилося обгортати тегований кеш у сховище array власноруч:

return Cache::store('array')->tags('permission_cache')->rememberForever($cacheKey,
    fn () => Cache::tags($this->cacheTags($user))->remember(
        $cacheKey,
        config('auth.permissions.default_cache_time'),
        fn () => $this->loadPermissionsFromDatabase($user)
    )
);

Запис і очищення

Методи, які змінюють значення, записують дані до тегованого кешу та видаляють мемоізовану копію цього ключа. Тому наступне зчитування знову звертається до сховища:

$cache = Cache::memo()->tags(['permissions']);

$cache->get('permissions:1');           // Зчитує з кеш-сховища
$cache->get('permissions:1');           // Зчитує з пам'яті
$cache->put('permissions:1', $updated); // Записує у сховище, забуває мемоізоване значення
$cache->get('permissions:1');           // Знову зчитує з кеш-сховища

Це стосується методів put(), putMany(), add(), increment(), decrement(), forever(), touch() та forget(). Виклик flush() на мемоізованому тегованому кеші очищує теги у сховищі та прибирає мемоізовані теговані значення.

Коли використовувати

Мемоізований кеш зберігає те, що поточний запит уже зчитав. Якщо обробник черги або інший запит змінить значення, поточний запит цієї зміни не побачить.

Цей підхід варто застосовувати для значень, які не змінюються протягом запиту, наприклад прав доступу або налаштувань. Лічильники та будь-які дані, які інший процес оновлює під час запиту, краще залишити в звичайному кеші.

Мемоізовані значення скидаються на початку кожного запиту або задачі, тому тривалі воркери не зберігають застарілі дані між завданнями.

Додаткові матеріали

  • Реліз Laravel 13.33, який додав підтримку tags()
  • Laravel 12.9, де вперше з'явився Cache::memo()
  • Інтерактивний пошук і видалення ключів кешу в Laravel за допомогою Cache UI
  • Документація Laravel про мемоізацію кешу
  • Pull request #61593 від Joost de Bruijn
17

Читати в документації

Коментарі

Увійдіть, щоб залишити коментар

Будьте першим, хто залишить коментар!

Читайте також

Новини 14 листопада 2026

RFC пропонує хуки життєвого циклу запиту для воркер-режиму PHP

Кевін Дюнгла виніс на обговорення RFC «Request lifecycle hooks for SAPIs with a worker mode»: два нові хуки модулів request_begin і request_end та функції php_request_begin() і php_request_end(). Вони мають замінити крихкі скидання стану, через які FrankenPHP цього року виправляв витік session ID і помилки пам'яті. Ціль - PHP 8.7, голосування ще не призначене.

7
Новини 14 листопада 2026

Laravel Storage Dedupler: один файл на диску замість десятка копій

Пакет maxkhim/laravel-storage-dedupler зберігає кожен файл один раз: ключем стає SHA-1 хеш вмісту, а моделі через трейт Deduplable отримують посилання на спільний UniqueFile. У версії 1.0.6 з'явився DEDUPLER_REMOVE_ORPHAN_ON_DETACH, що вирішує долю файлу після останнього detach.

Пакети за темою

Laravel Octane

laravel/octane

Прискорює застосунок, тримаючи його в пам'яті між запитами через FrankenPHP, Swoole або RoadRunner. Прибирає завантаження фреймворку з кожного запиту, даючи кратний приріст пропускної здатності.

4,035 v2.19.1 13 7

Laravel Pulse

laravel/pulse

Дашборд продуктивності застосунку в реальному часі: повільні запити й джоби, навантаження на сервери, використання кешу, найактивніші користувачі. Легка альтернатива зовнішнім APM-сервісам.

1,710 v1.8.0 13 4