От нуля до 35 миллионов: трудности масштабирования Laravel с помощью Octane
Статья описывает опыт автора по масштабированию веб-приложения, разработанного с использованием Laravel, с помощью Octane. Автор рассказывает о трудностях, с которыми он столкнулся при увеличении производительности приложения на фоне роста пользовательской базы до 35 миллионов запросов. В статье рассматриваются технические аспекты оптимизации и проблемы, такие как сложности с памятью, узкими местами в архитектуре и необходимость постоянного мониторинга и корректировок.
👉 @web_craft | #laravel
Статья описывает опыт автора по масштабированию веб-приложения, разработанного с использованием Laravel, с помощью Octane. Автор рассказывает о трудностях, с которыми он столкнулся при увеличении производительности приложения на фоне роста пользовательской базы до 35 миллионов запросов. В статье рассматриваются технические аспекты оптимизации и проблемы, такие как сложности с памятью, узкими местами в архитектуре и необходимость постоянного мониторинга и корректировок.
👉 @web_craft | #laravel
Работа с методом whenLoaded
Какие параметры принимает метод
Если забыли, то вернитесь к посту от26.08.2024 .
👉 @web_craft | #laravel
Какие параметры принимает метод
whenLoaded
?Если забыли, то вернитесь к посту от
👉 @web_craft | #laravel
Очистка журнала запросов в Laravel
Когда вы работаете с базой данных в Laravel, часто возникает необходимость отслеживать выполненные запросы для отладки и мониторинга производительности. Laravel предоставляет встроенную возможность вести журнал всех SQL-запросов, выполненных в рамках одного запроса HTTP. Для этого используется метод
Здесь на помощь приходит метод
Пример:
👉 @web_craft | #laravel
Когда вы работаете с базой данных в Laravel, часто возникает необходимость отслеживать выполненные запросы для отладки и мониторинга производительности. Laravel предоставляет встроенную возможность вести журнал всех SQL-запросов, выполненных в рамках одного запроса HTTP. Для этого используется метод
DB::enableQueryLog()
, который активирует журнал запросов. Однако, когда журнал становится слишком большим или его данные больше не нужны, вам может понадобиться его очистить.Здесь на помощь приходит метод
flushQueryLog()
. Этот метод позволяет быстро очистить текущий журнал запросов.Пример:
use Illuminate\Support\Facades\DB;
// Включение журнала запросов
DB::enableQueryLog();
// Выполнение запросов
$users = DB::table('users')->get();
$posts = DB::table('posts')->get();
// Очистка журнала запросов
DB::flushQueryLog();
// Проверка журнала запросов
$log = DB::getQueryLog();
print_r($log); // Пустой массив, если журнал был очищен
👉 @web_craft | #laravel
Пользовательские карточки Laravel Pulse
Статья объясняет, как создать пользовательские карточки в Laravel Pulse для отображения метрик, таких как количество запросов на каждую машину Fly.io. В ней описывается создание Livewire-компонента, настройка отображения данных на карточке, перехват запросов с помощью middleware и запись этих данных в таблицы Pulse. В конце показывается, как вывести собранные данные на кастомной карточке в панели управления Pulse.
👉 @WebCraft | #laravel
Статья объясняет, как создать пользовательские карточки в Laravel Pulse для отображения метрик, таких как количество запросов на каждую машину Fly.io. В ней описывается создание Livewire-компонента, настройка отображения данных на карточке, перехват запросов с помощью middleware и запись этих данных в таблицы Pulse. В конце показывается, как вывести собранные данные на кастомной карточке в панели управления Pulse.
👉 @WebCraft | #laravel
Работа с методом dispatchAfterResponse() в Laravel
Когда выполняется задача, отправленная с помощью метода
Если забыли, то вернитесь к посту от02.09.2024 .
👉 @web_craft | #laravel
Когда выполняется задача, отправленная с помощью метода
dispatchAfterResponse()
?Если забыли, то вернитесь к посту от
👉 @web_craft | #laravel
Защита полей модели
В Laravel механизм массового заполнения (
Предположим, у нас есть модель
В примере поля
👉 @WebCraft | #laravel
В Laravel механизм массового заполнения (
Mass Assignment
) позволяет быстро создавать или обновлять модели, заполняя их атрибуты массивом данных. Однако, чтобы предотвратить нежелательное или вредоносное заполнение полей, важно правильно настроить защиту через свойства $fillable
или $guarded
.$guarded
— это массив полей модели, которые запрещено массово заполнять. В отличие от $fillable
, который указывает на разрешенные для массового заполнения поля, $guarded
работает по принципу "запрещено всё, кроме". Это значит, что все поля модели защищены от массового заполнения, кроме тех, которые явно не указаны в массиве $guarded
.Предположим, у нас есть модель
User
, и мы хотим запретить массовое заполнение полей is_admin
и password
, чтобы они не могли быть изменены через массовое заполнение.class User extends Model
{
protected $guarded = ['is_admin', 'password'];
}
В примере поля
is_admin
и password
будут защищены от массового заполнения.👉 @WebCraft | #laravel
Прокси объектов коллекции в Laravel на уровне высших порядков
Статья описывает механизм прокси объектов в Laravel для работы с коллекциями. Высокоуровневые прокси позволяют передавать методы к объектам коллекций напрямую, упрощая код и делая его более читаемым. Примеры включают отправку писем заблокированным пользователям или автоматизацию браузеров при тестировании.
👉 @web_craft | #laravel
Статья описывает механизм прокси объектов в Laravel для работы с коллекциями. Высокоуровневые прокси позволяют передавать методы к объектам коллекций напрямую, упрощая код и делая его более читаемым. Примеры включают отправку писем заблокированным пользователям или автоматизацию браузеров при тестировании.
👉 @web_craft | #laravel
Работа с методом withoutSyncingToSearch()
Что делает метод
Если забыли, то вернитесь к посту от09.09.2024 .
👉 @web_craft | #laravel
Что делает метод
withoutSyncingToSearch()
в Laravel?Если забыли, то вернитесь к посту от
👉 @web_craft | #laravel
Кастомные атрибуты в моделях Laravel
В Laravel можно легко работать с кастомными атрибутами моделей, используя методы
-
-
В примере метод
👉 @web_craft | #laravel
В Laravel можно легко работать с кастомными атрибутами моделей, используя методы
getAttribute()
, setAttribute()
. Эти методы позволяют контролировать, как данные сохраняются и выводятся из модели.-
getAttribute()
: используется для доступа к значениям атрибутов. С его помощью можно модифицировать данные перед их возвратом.-
setAttribute()
: позволяет модифицировать данные перед их сохранением в базе. Это удобно для предварительной обработки данных, например, шифрования паролей.class User extends Model
{
public function getFullNameAttribute()
{
return "{$this->first_name} {$this->last_name}";
}
public function setPasswordAttribute($value)
{
$this->attributes['password'] = bcrypt($value);
}
}
В примере метод
getFullNameAttribute()
возвращает полное имя пользователя, а setPasswordAttribute()
шифрует пароль перед сохранением в базе данных.👉 @web_craft | #laravel
Использование метода flushQueryLog()
Для чего используется метод
Забыли? Вернитесь к посту от16.09.2024 .
👉 @web_craft | #laravel
Для чего используется метод
flushQueryLog()
в Laravel?Забыли? Вернитесь к посту от
👉 @web_craft | #laravel
Магия нового помощника defer() в Laravel
Статья объясняет, как работает новый хелпер
👉 @web_craft | #laravel
Статья объясняет, как работает новый хелпер
defer()
в Laravel, который позволяет откладывать выполнение долгих задач до завершения ответа. Он полезен для повышения производительности приложений, особенно при выполнении времязатратных операций, таких как обращения к внешним API. Автор также раскрывает детали работы метода и объясняет, как это реализовано на уровне middleware без использования очередей.👉 @web_craft | #laravel
Работа с массивом $guarded
Что делает массив
Если забыли, то вернитесь к посту от23.09.2024 .
👉 @WebCraft | #laravel
Что делает массив
$guarded
в модели Laravel?Если забыли, то вернитесь к посту от
👉 @WebCraft | #laravel
Хук для отмены восстановления удалённых моделей
Хук
Также можно использовать хук
👉 @web_craft | #laravel
Хук
eloquent.restoring
вызывается перед тем, как восстановить мягко удалённую модель. Если вернуть false
в функции-обработчике, Laravel отменит восстановление модели, и она останется помеченной как удалённая.use App\Models\User;
use Illuminate\Support\Facades\Event;
// Запрещаем восстановление заблокированных пользователей
Event::listen('eloquent.restoring: ' . User::class, function (User $user) {
if ($user->isBlocked) {
return false;
}
});
Также можно использовать хук
eloquent.restoring
для логирования попыток восстановления или выполнения асинхронных операций перед тем, как модель будет восстановлена:Event::listen('eloquent.restoring: ' . User::class, function (User $user) {
Log::info('Попытка восстановления пользователя: ' . $user->id);
if ($user->restorationAttempts >= 3) {
$user->sendRestorationWarning(); // Отправка предупреждения при частых попытках
return false;
}
});
👉 @web_craft | #laravel
Новый функционал для работы с массивами в PHP 8.4
Статья описывает новые функции для работы с массивами, которые появились в PHP 8.4:
👉 @web_craft | #laravel
Статья описывает новые функции для работы с массивами, которые появились в PHP 8.4:
array_find
, array_find_key
, array_any
и array_all
. Эти функции позволяют проще и удобнее проверять наличие элементов в массиве, получать ключи по условию и проверять элементы на соответствие заданным критериям. Приведены примеры использования каждой функции с объяснением, как они работают.👉 @web_craft | #laravel
Работа с моделями Laravel
Какой метод используется для изменения данных перед сохранением в модели?
Если забыли, то вернитесь к посту от23.09.2024 .
👉 @web_craft | #laravel
Какой метод используется для изменения данных перед сохранением в модели?
Если забыли, то вернитесь к посту от
👉 @web_craft | #laravel
Метод assertViewIs() для тестирования представлений в Laravel
Проверка, что страница входа использует правильный шаблон:
Проверка представления на основе ролей пользователей:
👉 @web_craft | #laravel
assertViewIs()
проверяет, что контроллер или маршрут возвращают конкретное представление, которое вы ожидаете увидеть. Проверка, что страница входа использует правильный шаблон:
public function testLoginPageReturnsCorrectView() {
$response = $this->get('/login');
$response->assertViewIs('auth.login');
}
Проверка представления на основе ролей пользователей:
public function testAdminUserSeesAdminPanel() {
$user = User::factory()->create(['role' => 'admin']);
$this->actingAs($user);
$response = $this->get('/dashboard');
$response->assertViewIs('admin.panel'); // Проверка на представление для админа
}
public function testRegularUserSeesHomePage() {
$user = User::factory()->create(['role' => 'user']);
$this->actingAs($user);
$response = $this->get('/dashboard');
$response->assertViewIs('home'); // Проверка на представление для обычного пользователя
}
👉 @web_craft | #laravel
Как Pinkary избегает регистрации с временных электронных адресов
В статье описывается, как платформа Pinkary (построенная на Laravel и Livewire) использует специальное правило валидации
👉 @web_craft | #laravel
В статье описывается, как платформа Pinkary (построенная на Laravel и Livewire) использует специальное правило валидации
UnauthorizedEmailProviders
для блокировки регистраций и обновлений email с временных доменов. Правило проверяет домен электронной почты с помощью списка запрещенных провайдеров, чтобы не допускать использования одноразовых адресов при регистрации на платформе.👉 @web_craft | #laravel
Хук eloquent.replicating в Laravel
В Laravel
Пример:
В данном примере email и токен пользователя очищаются перед тем, как модель будет скопирована. Это необходимо, чтобы избежать конфликта уникальных значений при сохранении новой записи.
👉 @web_craft | #laravel
В Laravel
eloquent.replicating
позволяет обработать момент клонирования модели с помощью метода replicate()
. Этот хук предоставляет возможность изменения или очистки данных перед созданием копии. Например, можно исключить чувствительные данные, такие как email, или сбросить уникальные поля, чтобы избежать конфликтов при сохранении клонированной записи в базе данных.Пример:
use App\Models\User;
use Illuminate\Support\Facades\Event;
Event::listen('eloquent.replicating: ' . User::class, function (User $user) {
// Очищаем уникальные поля перед копированием
$user->email = null;
$user->api_token = null;
});
В данном примере email и токен пользователя очищаются перед тем, как модель будет скопирована. Это необходимо, чтобы избежать конфликта уникальных значений при сохранении новой записи.
👉 @web_craft | #laravel
Гибкое кэширование в Laravel — это очень просто
Статья рассказывает о функции кэширования в Laravel —
👉 @web_craft | #laravel
Статья рассказывает о функции кэширования в Laravel —
Cache::flexible()
, которая позволяет балансировать между производительностью и свежестью данных с помощью двухуровневой системы TTL (Time to Live). Обсуждаются сценарии применения метода, такие как рекомендации в интернет-торговле, работа с аналитикой, и рассматриваются примеры реализации. Также описаны ситуации, когда эту функцию не следует использовать.👉 @web_craft | #laravel
Работа с хуком eloquent.restoring
Когда срабатывает хук
Если забыли, то вернитесь к посту от14.10.2024 .
👉 @web_craft | #laravel
Когда срабатывает хук
eloquent.restoring
?Если забыли, то вернитесь к посту от
👉 @web_craft | #laravel