HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <p>Если использовать персональные токены доступа Sanctum для API-аутентификации, можно заметить, что некоторые входящие запросы выполняются в 5-10 раз дольше, чем остальные. Всё дело в том, что при каждом запросе Sanctum выполняет обновление поля<em>last_used_at</em>в таблице<em>personal_access_tokens</em>. Большая часть запросов, в принципе, выполняется достаточно быстро, однако при увеличении их объёма, некоторые начинают тормозить.<a>Заметили эту проблему</a>уже не в первый раз, при этом, к сожалению, простого способа отключить это пока не найдено.</p>
1 <p>Если использовать персональные токены доступа Sanctum для API-аутентификации, можно заметить, что некоторые входящие запросы выполняются в 5-10 раз дольше, чем остальные. Всё дело в том, что при каждом запросе Sanctum выполняет обновление поля<em>last_used_at</em>в таблице<em>personal_access_tokens</em>. Большая часть запросов, в принципе, выполняется достаточно быстро, однако при увеличении их объёма, некоторые начинают тормозить.<a>Заметили эту проблему</a>уже не в первый раз, при этом, к сожалению, простого способа отключить это пока не найдено.</p>
2 <h2>Вариант решения</h2>
2 <h2>Вариант решения</h2>
3 <p>Если в вашем проекте информация о последнем применении токена не нужна, вы можете убрать её путём создания модели, к примеру, PersonalAccessToken с методом save(), проверяющим, изменено ли только поле<em>last_used_at</em>.</p>
3 <p>Если в вашем проекте информация о последнем применении токена не нужна, вы можете убрать её путём создания модели, к примеру, PersonalAccessToken с методом save(), проверяющим, изменено ли только поле<em>last_used_at</em>.</p>
4 <p>Поначалу, посредством artisan-команды была создана новая модель:</p>
4 <p>Поначалу, посредством artisan-команды была создана новая модель:</p>
5 php artisan make:model PersonalAccessToken<p>Далее внутри модели был задействован следующий код:</p>
5 php artisan make:model PersonalAccessToken<p>Далее внутри модели был задействован следующий код:</p>
6 <p>Эта наша кастомная модель расширяет модель из Sanctum, плюс имеет всего один метод save(). При этом она получает все изменённые значения, а также осуществляет проверку, станет ли сохраняться что-либо кроме<em>last_used_at</em>. Если ответ - да, то из Sanctum вызывается родительский метод save() . Если нет, то просто возвращается false, указывающий, что сохранения не было.</p>
6 <p>Эта наша кастомная модель расширяет модель из Sanctum, плюс имеет всего один метод save(). При этом она получает все изменённые значения, а также осуществляет проверку, станет ли сохраняться что-либо кроме<em>last_used_at</em>. Если ответ - да, то из Sanctum вызывается родительский метод save() . Если нет, то просто возвращается false, указывающий, что сохранения не было.</p>
7 <p>После создания этой кастомной модели следует задать её применение вместо дефолтной. Выполнить мы это можем с помощью метода boot() класса<em>Providers/AppServiceProvider.php</em>. При этом в Sanctum предусмотрен статический метод usePersonalAccessTokenModel(), который вы можете применить для задания модели для токенов.</p>
7 <p>После создания этой кастомной модели следует задать её применение вместо дефолтной. Выполнить мы это можем с помощью метода boot() класса<em>Providers/AppServiceProvider.php</em>. При этом в Sanctum предусмотрен статический метод usePersonalAccessTokenModel(), который вы можете применить для задания модели для токенов.</p>
8 <p>Как это примерно будет выглядеть, можете посмотреть ниже:</p>
8 <p>Как это примерно будет выглядеть, можете посмотреть ниже:</p>
9 <p>В результате вышеописанных действий был сразу замечен прирост производительности, ведь запись в базе данных - дорогая операция, особенно если применять репликацию и разделение чтения/записи.</p>
9 <p>В результате вышеописанных действий был сразу замечен прирост производительности, ведь запись в базе данных - дорогая операция, особенно если применять репликацию и разделение чтения/записи.</p>
10 <p><em>По материалам статьи<a>Improving Laravel Sanctum Personal Access Token Performance</a>.</em></p>
10 <p><em>По материалам статьи<a>Improving Laravel Sanctum Personal Access Token Performance</a>.</em></p>
11  
11