Управление сессиями Laravel в кластерах Kubernetes
В то время как Kubernetes предоставляет преимущества, такие как горизонтальное масштабирование без сохранения состояния, фоновая обработка и гибкость хранения, он вводит сложности для управления сессиями.
Проблемы возникают из-за отсутствия состояния в подах Kubernetes, что может привести к несогласованным данным сессии и проблемам с опытом пользователя. Статья предлагает два решения для разработчиков Laravel:
1️⃣Клиентские сессии (Session Affinity): Это включает в себя настройку Kubernetes для обеспечения того, чтобы запросы от конкретного клиента постоянно направлялись к одному и тому же поду. Это можно достичь через сессионную аффинность на основе IP или куки. В то время как это может решить некоторые проблемы, это может привести к неравномерному распределению трафика и потенциальным нарушениям, если под, обрабатывающий клиентскую сессию, сталкивается с проблемами.
2️⃣Распределенное хранилище сессий с Redis: В статье предлагается использовать Redis в качестве распределенного хранилища сессий для обмена данными сессии между несколькими экземплярами приложения Laravel. Redis выбран из-за своей производительности, масштабируемости, устойчивости и поддержки различных структур данных. Предоставлены шаги по настройке Redis в качестве драйвера сессии в Laravel, включая установку необходимого пакета, обновление конфигурационных файлов и развертывание Redis в Kubernetes с использованием Helm.
Реализуя либо клиентские сессии, либо распределенное хранилище сессий с Redis, разработчики Laravel могут преодолеть проблемы, внесенные Kubernetes, обеспечивая согласованное управление сессиями и опыт пользователя в масштабируемых средах.
В то время как Kubernetes предоставляет преимущества, такие как горизонтальное масштабирование без сохранения состояния, фоновая обработка и гибкость хранения, он вводит сложности для управления сессиями.
Проблемы возникают из-за отсутствия состояния в подах Kubernetes, что может привести к несогласованным данным сессии и проблемам с опытом пользователя. Статья предлагает два решения для разработчиков Laravel:
1️⃣Клиентские сессии (Session Affinity): Это включает в себя настройку Kubernetes для обеспечения того, чтобы запросы от конкретного клиента постоянно направлялись к одному и тому же поду. Это можно достичь через сессионную аффинность на основе IP или куки. В то время как это может решить некоторые проблемы, это может привести к неравномерному распределению трафика и потенциальным нарушениям, если под, обрабатывающий клиентскую сессию, сталкивается с проблемами.
2️⃣Распределенное хранилище сессий с Redis: В статье предлагается использовать Redis в качестве распределенного хранилища сессий для обмена данными сессии между несколькими экземплярами приложения Laravel. Redis выбран из-за своей производительности, масштабируемости, устойчивости и поддержки различных структур данных. Предоставлены шаги по настройке Redis в качестве драйвера сессии в Laravel, включая установку необходимого пакета, обновление конфигурационных файлов и развертывание Redis в Kubernetes с использованием Helm.
Реализуя либо клиентские сессии, либо распределенное хранилище сессий с Redis, разработчики Laravel могут преодолеть проблемы, внесенные Kubernetes, обеспечивая согласованное управление сессиями и опыт пользователя в масштабируемых средах.
Laravel News
Stateful Scaling: Laravel Session Management in Kubernetes Clusters - Laravel News
Learn some of the gotchas in Laravel session management you’ll experience as you move to a Kubernetes deployment
❤3👍3
Что означает утверждение о том, что СУБД поддерживает контроль ссылочной целостности связей?
Утверждение о том, что СУБД поддерживает контроль ссылочной целостности связей означает, что СУБД автоматически обеспечивает целостность данных, связанных между таблицами. Она регулирует и проверяет соответствие значений внешнего ключа (foreign key) со значениями первичного ключа (primary key) родительской таблицы.
#вопросы_с_собеседований
Утверждение о том, что СУБД поддерживает контроль ссылочной целостности связей означает, что СУБД автоматически обеспечивает целостность данных, связанных между таблицами. Она регулирует и проверяет соответствие значений внешнего ключа (foreign key) со значениями первичного ключа (primary key) родительской таблицы.
#вопросы_с_собеседований
👍15🥱9
Создание базовой схемы GraphQL, используя атрибуты PHP и Resonance
Статья рассматривает концепцию GraphQL как альтернативы REST и других систем API, которая преобразует приложение в графовую базу данных, с которой можно выполнять запросы.
Основная идея заключается в том, что вместо того чтобы выставлять и создавать специфические конечные точки, можно выставить структуры данных.
Resonance представляет собой асинхронный PHP-фреймворк, способный параллельно разрешать все поля GraphQL.
Статья начинается с базовой схемы GraphQL, предоставляющей объект ping с единственным полем message, всегда возвращающим «pong».
Основной акцент делается на использовании Resonance для обработки запросов GraphQL асинхронно. Приводится пример кода на PHP для создания GraphQL-схемы, Responder для обработки POST-запросов на '/graphql' и пример объекта типа Ping.
Статья рассматривает концепцию GraphQL как альтернативы REST и других систем API, которая преобразует приложение в графовую базу данных, с которой можно выполнять запросы.
Основная идея заключается в том, что вместо того чтобы выставлять и создавать специфические конечные точки, можно выставить структуры данных.
Resonance представляет собой асинхронный PHP-фреймворк, способный параллельно разрешать все поля GraphQL.
Статья начинается с базовой схемы GraphQL, предоставляющей объект ping с единственным полем message, всегда возвращающим «pong».
Основной акцент делается на использовании Resonance для обработки запросов GraphQL асинхронно. Приводится пример кода на PHP для создания GraphQL-схемы, Responder для обработки POST-запросов на '/graphql' и пример объекта типа Ping.
DEV Community
Build a Basic GraphQL Schema Using PHP
What is GraphQL? GraphQL is an alternative to REST and other API systems that, in essence,...
❤7👍6
🧑💻 Статьи для IT: как объяснять и распространять значимые идеи
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
🥱2👍1
Создание быстрого и простого пользовательского интерфейса мгновенного поиска с помощью Alpine AJAX и Laravel.
Здесь рассказывается о том, как добавить мгновенный фильтр поиска в вашем Laravel-приложении, используя библиотеку Alpine AJAX, создавая функцию «поиска на лету» без написания JavaScript. Пример показан на списке контактов, где пользователи могут искать контакты по имени или электронной почте.
⚙️Настройка данных:
Начните с новой установки Laravel и настройте базу данных.
Запустите миграции (php artisan migrate), чтобы создать таблицу «users».
Используйте Tinker (php artisan tinker), чтобы создать пример данных пользователя (User::factory()->count(20)->create()).
🎨Настройка view:
Создайте шаблон Blade в resources/views/contacts.blade.php.
Разработайте базовую страницу с формой поиска и списком контактов.
Отбросьте стили CSS для простоты.
🌐Логика маршрута:
Создайте маршрут в /contacts в routes/web.php.
Реализуйте логику проверки наличия поискового запроса в запросе и фильтрации результатов из таблицы «users» соответственно.
📜Взаимодействие с Alpine AJAX:
Включите скрипты Alpine и Alpine AJAX в заголовок страницы.
Улучшите форму поиска с помощью атрибутов Alpine:
x-init: Инициализирует компонент Alpine.
x-target: Указывает целевой элемент для обновлений AJAX.
@input.debounce: Автоматически отправляет форму при изменении ввода.
x-show="false»: Скрывает кнопку отправки, обеспечивая резервный вариант, если JavaScript не загружен.
🔄Результат:
Список контактов мгновенно обновляется при вводе, благодаря Alpine AJAX.
Здесь рассказывается о том, как добавить мгновенный фильтр поиска в вашем Laravel-приложении, используя библиотеку Alpine AJAX, создавая функцию «поиска на лету» без написания JavaScript. Пример показан на списке контактов, где пользователи могут искать контакты по имени или электронной почте.
⚙️Настройка данных:
Начните с новой установки Laravel и настройте базу данных.
Запустите миграции (php artisan migrate), чтобы создать таблицу «users».
Используйте Tinker (php artisan tinker), чтобы создать пример данных пользователя (User::factory()->count(20)->create()).
🎨Настройка view:
Создайте шаблон Blade в resources/views/contacts.blade.php.
Разработайте базовую страницу с формой поиска и списком контактов.
Отбросьте стили CSS для простоты.
🌐Логика маршрута:
Создайте маршрут в /contacts в routes/web.php.
Реализуйте логику проверки наличия поискового запроса в запросе и фильтрации результатов из таблицы «users» соответственно.
📜Взаимодействие с Alpine AJAX:
Включите скрипты Alpine и Alpine AJAX в заголовок страницы.
Улучшите форму поиска с помощью атрибутов Alpine:
x-init: Инициализирует компонент Alpine.
x-target: Указывает целевой элемент для обновлений AJAX.
@input.debounce: Автоматически отправляет форму при изменении ввода.
x-show="false»: Скрывает кнопку отправки, обеспечивая резервный вариант, если JavaScript не загружен.
🔄Результат:
Список контактов мгновенно обновляется при вводе, благодаря Alpine AJAX.
Imacrayon
Build a Quick & Easy Instant Search User Interface using Alpine AJAX & Laravel
How to build an instant search filter using Alpine AJAX & Laravel
👍5🥱3🤔2
#хочу_спросить
Задавайте любые вопросы о программировании и получайте ответы от пользователей. В комментариях под постом укажите #язык, #стек и/или #библиотеку, по которым задаете вопрос.
Задавайте любые вопросы о программировании и получайте ответы от пользователей. В комментариях под постом укажите #язык, #стек и/или #библиотеку, по которым задаете вопрос.
❤4
Предотвращение спама в формах Statamic
В этой статье рассказывается о том, как добавить службу предотвращения спама к формам в Statamic для отклонения подозрительных отправок. Автор использует Akismet, но подчеркивает, что можно выбрать любую службу предотвращения спама. Шаги включают создание учетной записи Akismet, получение API-ключа и добавление его в файл .env, а также создание слушателя, который вызывается при отправке формы. Для проверки на спам используется метод isSpam, который в данном случае отправляет данные формы на проверку в Akismet.
Также указаны возможные улучшения, такие как отображение спамных отправок в панели управления Statamic и заменяемость службы предотвращения спама на другую.
В этой статье рассказывается о том, как добавить службу предотвращения спама к формам в Statamic для отклонения подозрительных отправок. Автор использует Akismet, но подчеркивает, что можно выбрать любую службу предотвращения спама. Шаги включают создание учетной записи Akismet, получение API-ключа и добавление его в файл .env, а также создание слушателя, который вызывается при отправке формы. Для проверки на спам используется метод isSpam, который в данном случае отправляет данные формы на проверку в Akismet.
Также указаны возможные улучшения, такие как отображение спамных отправок в панели управления Statamic и заменяемость службы предотвращения спама на другую.
DEV Community
Prevent spam in Statamic forms
If you're using Statamic's Forms feature to power a public facing form, you'll benefit from using...
❤4
Что такое namespace и зачем они?
Namespace в PHP — это механизм, который позволяет управлять областями видимости в коде, предотвращая конфликты имен и обеспечивая логическую организацию кода. Введение пространств имен в PHP позволяет структурировать проект, избегать конфликтов именования классов, функций и констант, а также облегчает интеграцию различных библиотек и компонентов.
Зачем используются пространства имен:
Избежание конфликтов имен: Проекты могут содержать множество классов, функций и констант. Пространства имен позволяют изолировать эти имена друг от друга, предотвращая возможные конфликты, особенно при использовании сторонних библиотек.
Организация кода: Пространства имен помогают логически организовать код, разделяя его на логические группы. Например, все классы, связанные с базой данных, могут быть помещены в пространство имен Database.
Автозагрузка классов: Использование пространств имен может сделать автозагрузку классов более эффективной и структурированной, особенно при использовании стандартов автозагрузки, таких как PSR-4.
#вопросы_с_собеседований
Namespace в PHP — это механизм, который позволяет управлять областями видимости в коде, предотвращая конфликты имен и обеспечивая логическую организацию кода. Введение пространств имен в PHP позволяет структурировать проект, избегать конфликтов именования классов, функций и констант, а также облегчает интеграцию различных библиотек и компонентов.
Зачем используются пространства имен:
Избежание конфликтов имен: Проекты могут содержать множество классов, функций и констант. Пространства имен позволяют изолировать эти имена друг от друга, предотвращая возможные конфликты, особенно при использовании сторонних библиотек.
Организация кода: Пространства имен помогают логически организовать код, разделяя его на логические группы. Например, все классы, связанные с базой данных, могут быть помещены в пространство имен Database.
Автозагрузка классов: Использование пространств имен может сделать автозагрузку классов более эффективной и структурированной, особенно при использовании стандартов автозагрузки, таких как PSR-4.
#вопросы_с_собеседований
🥱13👍5❤1
Полезные каналы по PHP :
PHP вакансии — @rabotaphp
Вакансии для PHP-разработчиков.
Уютное сообщество пхпшников. Книги — @phpdom
Книги + тесты на знание языка + туториалы и разборы кода
PHP books — @phpbook.
Книги по PHP и смежным технологиям;
Реклама. Киренкина Марина Дмитриевна, ИНН 345702417736. Erid 2VtzqwpUHeH
PHP вакансии — @rabotaphp
Вакансии для PHP-разработчиков.
Уютное сообщество пхпшников. Книги — @phpdom
Книги + тесты на знание языка + туториалы и разборы кода
PHP books — @phpbook.
Книги по PHP и смежным технологиям;
Реклама. Киренкина Марина Дмитриевна, ИНН 345702417736. Erid 2VtzqwpUHeH
🥱3❤1
Автор столкнулся с ошибкой «Lock wait timeout» при создании многоадресного API с использованием Laravel и трейта RefreshDatabase. Приложение имело базу данных платформы и отдельную базу данных для каждого арендатора, выбираемую во время выполнения на основе ключа API. Тесты, использующие трейт RefreshDatabase, приводили к ошибке времени ожидания блокировки. Причина была обнаружена в переключении базы данных во время выполнения, что сбивало с толку управление транзакциями Laravel. Решением стало использование свойства connectionsToTransact в классе TestCase, указывающего базы данных, участвующие в транзакциях. Это позволило транзакциям охватывать изменение базы данных и устранило проблему времени ожидания блокировки. Кроме того, это гарантировало правильную очистку тестовых данных из обеих баз данных после выполнения тестов.
Conroyp
Juggling Databases When Testing With Laravel: Tackling the Lock Wait Timeout Error
Discover how to tackle Laravel's testing challenges in multi-database scenarios. Say goodbye to the notorious 'Lock wait timeout' error.
❤5
Безотказные очереди в RabbitMQ: Гарантированная доставка сообщений
Статья представляет RabbitMQ как открытую реализацию протокола AMQP (Advanced Message Queuing Protocol) и мощный брокер сообщений, обеспечивающий эффективное взаимодействие между компонентами системы. Автор фокусируется на безотказных очередях в RabbitMQ и их важности в распределенных системах.🚀
🔑Почему безотказные очереди важны:
🛡️В условиях сбоев и ошибок обеспечение надежной доставки сообщений становится жизненно важным. Безотказные очереди решают эту проблему, гарантируя сохранение сообщений до их успешной доставки, что обеспечивает стабильное взаимодействие между системами.
🤔Проблемы при проектировании решения:
Описывается сценарий, где компоненты системы обмениваются важными сообщениями, и из-за временной недоступности одной системы отправка сообщений может не удаваться.⏳ Решение в «quorum» очередях RabbitMQ предоставляет параметры для контроля попыток отправки, но возникают проблемы с отсутствием встроенной задержки.
🛠️Механизм работы выбранного решения:
Автор представляет механизм обработки сообщений, использующий обменники, первичные очереди, обработку ошибок и механизм повторных попыток.🔄 Он объясняет, как сообщения направляются через различные очереди, как управляется количество попыток и как обеспечивается гибкость и надежность в обработке сообщений.
Статья представляет RabbitMQ как открытую реализацию протокола AMQP (Advanced Message Queuing Protocol) и мощный брокер сообщений, обеспечивающий эффективное взаимодействие между компонентами системы. Автор фокусируется на безотказных очередях в RabbitMQ и их важности в распределенных системах.🚀
🔑Почему безотказные очереди важны:
🛡️В условиях сбоев и ошибок обеспечение надежной доставки сообщений становится жизненно важным. Безотказные очереди решают эту проблему, гарантируя сохранение сообщений до их успешной доставки, что обеспечивает стабильное взаимодействие между системами.
🤔Проблемы при проектировании решения:
Описывается сценарий, где компоненты системы обмениваются важными сообщениями, и из-за временной недоступности одной системы отправка сообщений может не удаваться.⏳ Решение в «quorum» очередях RabbitMQ предоставляет параметры для контроля попыток отправки, но возникают проблемы с отсутствием встроенной задержки.
🛠️Механизм работы выбранного решения:
Автор представляет механизм обработки сообщений, использующий обменники, первичные очереди, обработку ошибок и механизм повторных попыток.🔄 Он объясняет, как сообщения направляются через различные очереди, как управляется количество попыток и как обеспечивается гибкость и надежность в обработке сообщений.
❤4👍1
Что скажете про HTMX, использовали ли?🔽🔽🔽
🥱12👍2🤔1
Минимум, который должен знать каждый разработчик программного обеспечения о Unicode в 2023 году
Unicode — это стандарт, целью которого является унификация всех человеческих языков и обеспечение их работы с компьютерами. Каждому символу присваивается уникальный номер, называемый кодовой точкой.
Статья подробно рассматривает кодовые точки, приводит примеры (например, буквы латинского алфавита, символы эмодзи), и объясняет, как Unicode решает проблему представления различных языков. Она также затрагивает кодировки UTF-8 и UTF-16, описывая, как они представляют символы в памяти компьютера.
Стоит также обратить внимание на важность использования библиотек для работы с Unicode, особенно при выполнении операций, таких как определение границ графем и нормализация строк.
Unicode — это стандарт, целью которого является унификация всех человеческих языков и обеспечение их работы с компьютерами. Каждому символу присваивается уникальный номер, называемый кодовой точкой.
Статья подробно рассматривает кодовые точки, приводит примеры (например, буквы латинского алфавита, символы эмодзи), и объясняет, как Unicode решает проблему представления различных языков. Она также затрагивает кодировки UTF-8 и UTF-16, описывая, как они представляют символы в памяти компьютера.
Стоит также обратить внимание на важность использования библиотек для работы с Unicode, особенно при выполнении операций, таких как определение границ графем и нормализация строк.
tonsky.me
The Absolute Minimum Every Software Developer Must Know About Unicode in 2023 (Still No Excuses!)
Modern extension to classic 2003 article by Joel Spolsky
❤4
#дайджест новостей по PHP за неделю:
🔎Вышел PHP 8.3!
🔎PhpStorm теперь поддерживает PHP 8.3 — На сегодняшний день PhpStorm обеспечивает полную поддержку всех улучшений PHP 8.3.
🔎Выпущена версия Laravel 10.32 — На этой неделе команда Laravel выпустила версию 10.32 с новыми директивами условного нажатия Blade и многим другим.
🔎Выпущена Symfony 7.0.0-RC1 — Только что выпущена Symfony 7.0.0-RC1. Вот список наиболее важных изменений с версии 7.0.0-BETA3.
🔎 Неделя Symfony #881 (13–19 ноября 2023 г.) — В этой сборке вы можете обнаружить несколько улучшений в различных подсистемах.
🔎PhpStorm 2023.3 Beta
🔎Вышел PHP 8.3!
🔎PhpStorm теперь поддерживает PHP 8.3 — На сегодняшний день PhpStorm обеспечивает полную поддержку всех улучшений PHP 8.3.
🔎Выпущена версия Laravel 10.32 — На этой неделе команда Laravel выпустила версию 10.32 с новыми директивами условного нажатия Blade и многим другим.
🔎Выпущена Symfony 7.0.0-RC1 — Только что выпущена Symfony 7.0.0-RC1. Вот список наиболее важных изменений с версии 7.0.0-BETA3.
🔎 Неделя Symfony #881 (13–19 ноября 2023 г.) — В этой сборке вы можете обнаружить несколько улучшений в различных подсистемах.
🔎PhpStorm 2023.3 Beta
👍9❤2
В этой статье обсуждается, как предотвратить дублирование отправок форм или запросов в приложениях Laravel с использованием атомарных блокировок. Атомарные блокировки помогают управлять распределенными блокировками, не беспокоясь о состязательности.
В примере рассматривается сценарий, в котором пользователь инициирует платежи через форму. Чтобы предотвратить нежелательные последствия, такие как обработка одного и того же запроса несколько раз, представлены атомарные блокировки. Реализация иллюстрируется в SendPaymentController.
Метод Cache::lock используется для создания атомарной блокировки. Он принимает три аргумента: имя блокировки, продолжительность ее действия и необязательный параметр владельца. Имя должно быть уникальным, чтобы избежать коллизий.
В примере SendPaymentController создается блокировка с уникальным именем ({$account->id}:payment:send), которая остается действительной в течение 10 секунд. Если блокировка получена, запрос обрабатывается, и пользователь перенаправляется с сообщением об успехе. Если блокировка не получена, пользователь перенаправляется с сообщением об ошибке.
В примере рассматривается сценарий, в котором пользователь инициирует платежи через форму. Чтобы предотвратить нежелательные последствия, такие как обработка одного и того же запроса несколько раз, представлены атомарные блокировки. Реализация иллюстрируется в SendPaymentController.
Метод Cache::lock используется для создания атомарной блокировки. Он принимает три аргумента: имя блокировки, продолжительность ее действия и необязательный параметр владельца. Имя должно быть уникальным, чтобы избежать коллизий.
В примере SendPaymentController создается блокировка с уникальным именем ({$account->id}:payment:send), которая остается действительной в течение 10 секунд. Если блокировка получена, запрос обрабатывается, и пользователь перенаправляется с сообщением об успехе. Если блокировка не получена, пользователь перенаправляется с сообщением об ошибке.
Daryl Legion
Preventing Duplicate Form Submissions Using Atomic Locks
Prevent duplicate form submissions and job dispatching using Laravel's atomic locks.
❤7
Stressless — стресс-тестирование с помощью PEST
🔎В ходе LaraconAU представлены две значимые новинки: Laravel Pulse и плагин Stressless от Nuno Maduro, предназначенный для стресс-тестирования приложений.
❗Стресс-тестирование в области тестирования программного обеспечения направлено на оценку производительности приложения или системы при экстремальных нагрузках. Этот вид тестирования включает в себя создание сценариев, специально разработанных для превышения типичных операционных пределов системы.
Stressless использует инструмент k6, мощный инструмент с открытым исходным кодом для нагрузочного тестирования, чтобы оценить производительность API, микросервисов и веб-сайтов. Плагин интегрируется с Expectation API в Pest, обеспечивая отсутствие регрессий в стабильности и надежности приложения.
🔎В ходе LaraconAU представлены две значимые новинки: Laravel Pulse и плагин Stressless от Nuno Maduro, предназначенный для стресс-тестирования приложений.
❗Стресс-тестирование в области тестирования программного обеспечения направлено на оценку производительности приложения или системы при экстремальных нагрузках. Этот вид тестирования включает в себя создание сценариев, специально разработанных для превышения типичных операционных пределов системы.
Stressless использует инструмент k6, мощный инструмент с открытым исходным кодом для нагрузочного тестирования, чтобы оценить производительность API, микросервисов и веб-сайтов. Плагин интегрируется с Expectation API в Pest, обеспечивая отсутствие регрессий в стабильности и надежности приложения.
Introducing Stressless - Stress Testing with PEST
This week was full of treats for Laravel developers due to LaraconAU. After the launch of Laravel Pulse, Nuno Maduro announced a new plugin called...
❤5