Крім кешу конфігурації й маршрутів, php artisan optimize створює ще два кеші, про які часто забувають.
event:cache - мапа подій і слухачів.
Laravel може сам знаходити слухачів: сканує каталог app/Listeners і за типом параметра handle(OrderShipped $event) визначає, на яку подію слухач підписаний. Зручно, але сканування файлів і Reflection на кожен запит - зайва робота.
php artisan event:cache # записати мапу в bootstrap/cache/events.php
php artisan event:clear
Після кешування Laravel бере мапу з файлу, нічого не скануючи.
Коли поводиться неочікувано:
- новий слухач не спрацьовує - кеш створено до його появи. Кеш має перебудовуватися при кожному деплої;
- локально кеш подій зазвичай не потрібен і заважає: додали слухача - і забули очистити кеш.
view:cache - скомпільовані шаблони Blade.
Blade компілює кожен шаблон у звичайний PHP-файл у storage/framework/views при першому зверненні й перекомпільовує, якщо шаблон змінився. view:cache компілює всі шаблони заздалегідь:
- перший запит після деплою не витрачає час на компіляцію;
- помилка синтаксису Blade виявляється під час деплою, а не в користувача.
Коли поводиться неочікувано:
- права: скомпільовані файли створені від
rootпід час деплою, а PHP-FPM працює відwww-data- при спробі перекомпілювати виникає помилка доступу; - кілька серверів чи контейнерів - кеш формується на кожному окремо, і він має відповідати коду саме цього сервера;
- змінені шаблони без очищення кешу в нестандартному деплої (файли змінено на місці) - Blade перевіряє час зміни файлів, але з OPcache і
validate_timestamps=0старий скомпільований PHP може лишитися в пам'яті.
Загальне правило для всіх кешів: у деплої спершу оновити код і залежності, потім php artisan optimize (конфігурація, маршрути, події, представлення), потім перезапустити процеси, що тримають код у пам'яті (PHP-FPM reload чи OPcache reset, воркери черг, Octane). А локально - php artisan optimize:clear, якщо поведінка не відповідає коду.
Що не кешується цими командами: дані застосунку (Cache::), відповіді й запити - це окремий рівень, і optimize:clear його не чіпає.
Докладніше в документації: Події: пошук слухачів на продакшені