Подписывайтесь на наш Telegram канал и будьте в курсе всех событий.

Александр Черняев

С ремеслом дружу
Александр Черняев

С ремеслом дружу

Подготовьтесь к взлёту: Новый раздел для веб-ремеслеников 🚀

Сегодня, в честь Дня Космонавтики, хочу поздравить всех вас, кто работает с Laravel и PHP! Это не только повод для праздника, но и время для вдохновения и новых возможностей.

Не могу не подчеркнуть, насколько важно постоянно развиваться и совершенствовать свои навыки. И именно поэтому рад объявить о запуске нового раздела, который поможет нам всем стать ещё лучше в разработке, особенно в Laravel, независимо от уровня опыта.

Хотите быть среди первых, кто погрузится в этот новый раздел и опередит коллег? Тогда примите участие в игровом событии, переходя по ссылке:

Тяга к знаниям двигает нас к звёздам | Laravel Russian Community

https://laravel.su/vostok

Пусть эта дата вдохновляет нас на новые открытия и смелые шаги в неизведанные просторы Вселенной.

Не забудьте, что нужно набрать как можно больше количество очков для открытия всех секретов этого раздела! Давайте вместе достигнем новых вершин! 🌟

2
Александр Черняев

С ремеслом дружу

SQLite в производстве

Для очень-очень многих проектов нет экономического оправдания использования многих технологий и кажется что чем проще, тем лучше. SQLite предоставляет для разработчика очень простой механизм, не нужно ни настраивать пользователей, ни защищать сетевой подключение, ни обслуживать процессы, только файл в котором будет хранится данные. Что может быть проще?

По этому не удивительно, что SQLite в последнее время набирает популярность не только на локальных устройствах, но в веб приложениях, например Rails 7.1 поставляется с настроенной SQLite базой по умолчанию и с новым оптимизированным драйвером. А начиная с Laravel 11.x так же будет поставляется с SQLite по умолчанию, так как это самый простой способ начать работать и запуститься в производство.

Как и у любой базы данных есть свои особоенности и скорее всего вы познакомитесь с ними когда будете выполнять миграции и локальную разработку. По этому давайте сосредоточимся на том, что бы подготовит базу данных для работы с Laravel в производственной среде.

Одновременное чтение и запись

По умолчанию SQLite может либо читать данные, либо записывать, но не оба действия одновременно. Если в вашем проекте соотношение чтения к записи намного больше, то это совсем не проблема.

В противном случае включите режим упреждающей записи (WAL) командой:

sqlite3 database.sqlite "PRAGMA journal_mode = wal"

Этот шаг переведет вашу базу данных в режим WAL, что позволит ей эффективно обрабатывать одновременные операции чтения и записи. Вы можете убедиться в этом, выполнив следующую команду:

sqlite3 database.sqlite "PRAGMA journal_mode"

Если результатом является wal, это означает, что база данных успешно переведена в режим предварительной записи.

Удаление данных

По умолчанию SQLite физичиски не удаляет данные, по этому размер файла может сильно расти, что бы осовободить неиспользуемое дисковое пространство необходимо выполнить команду vacuum:

sqlite3 database.sqlite "PRAGMA vacuum;"

Перед выполнением база данных будет автоматически скопирована, чтобы избежать блокировки работы приложения. Однако это означает, что для выполнения операции потребуется свободное дисковое пространство, превышающее размер исходной базы данных в два раза.

Оптимизация

Чтобы добиться наилучшей долгосрочной производительности запросов без необходимости проведения детального технического анализа схемы необходимо выполнять команду оптимизации:

sqlite3 database.sqlite "PRAGMA optimize;"

Лучше всего выполнять эту команду с переодичностью, например каждый час.

Синхронизация

По умолчанию SQLIte синхронизирует журнал отказа после каждого запроса на изменение, что бы гарантировать, что весь контент безопасно записан на диск, однако это не всегда необходимо, можно изменить этот режим выполнив первым запросом в соединении:

sqlite3 database.sqlite "PRAGMA synchronous = normal;"

Это будет иметь эффект только на конкретное соединение, по этому вам скорее всего потребуется внести изменения в ваш код.

Использование в Laravel

Теперь, когда мы ознакомились с этими командами, настало время внедрить их в наше приложение на Laravel для максимального удобства. Например, вместо настройки новых задач на уровне сервера, сделать это на уровне приложения:

$schedule->command('sqlite:optimize')->everyMinute();
$schedule->command('sqlite:vacuum')->daily();

Cпециально для этих целей создал пакет небольшой Composer, который позволяет вызывать каждую из них легко с помощью Artisan:

Пакет добавляющий инструменты для эффективного использования SQLite в Laravel

Не стесняйтесь присоединиться к развитию проекта и делиться своим опытом использования!

0