Ускоряем Laravel Sanctum
Если использовать персональные токены доступа Sanctum для API-аутентификации, можно заметить, что некоторые входящие запросы выполняются в 5-10 раз дольше, чем остальные. Всё дело в том, что при каждом запросе Sanctum выполняет обновление поля last_used_at в таблице personal_access_tokens. Большая часть запросов, в принципе, выполняется достаточно быстро, однако при увеличении их объёма, некоторые начинают тормозить. Заметили эту проблему уже не в первый раз, при этом, к сожалению, простого способа отключить это пока не найдено.
Вариант решения
Если в вашем проекте информация о последнем применении токена не нужна, вы можете убрать её путём создания модели, к примеру, PersonalAccessToken с методом save(), проверяющим, изменено ли только поле last_used_at.
Поначалу, посредством artisan-команды была создана новая модель:
php artisan make:model PersonalAccessToken
Далее внутри модели был задействован следующий код:
Эта наша кастомная модель расширяет модель из Sanctum, плюс имеет всего один метод save(). При этом она получает все изменённые значения, а также осуществляет проверку, станет ли сохраняться что-либо кроме last_used_at. Если ответ — да, то из Sanctum вызывается родительский метод save() . Если нет, то просто возвращается false, указывающий, что сохранения не было.
После создания этой кастомной модели следует задать её применение вместо дефолтной. Выполнить мы это можем с помощью метода boot() класса Providers/AppServiceProvider.php. При этом в Sanctum предусмотрен статический метод usePersonalAccessTokenModel(), который вы можете применить для задания модели для токенов.
Как это примерно будет выглядеть, можете посмотреть ниже:
В результате вышеописанных действий был сразу замечен прирост производительности, ведь запись в базе данных — дорогая операция, особенно если применять репликацию и разделение чтения/записи.
По материалам статьи Improving Laravel Sanctum Personal Access Token Performance.