🧠 DSL vs паттерны: что выбрать в проекте
В разработке часто встаёт вопрос: использовать ли DSL (Domain Specific Language) или опираться на дизайн-паттерны. Оба подхода помогают структурировать работу с данными и бизнес-логикой, но дают разный результат.
🔍 В чём разница
Паттерны делают код более гибким и слабо связанным, позволяют легко подменять компоненты. Но вместе с этим усложняют ментальную модель — приходится держать в голове фабрики, адаптеры и репозитории, а сама бизнес-логика может «растворяться» в слоях абстракций.
DSL описывает действия напрямую. Язык ближе к предметной области и проще для восприятия, особенно когда задачи сложные или действия цепочкой. Он позволяет выразить логику в явном виде и сократить количество лишних запросов и пост-обработки.
⚠️ Ограничения DSL
🔸 Создание DSL требует серьёзной подготовки: язык должен быть достаточно гибким, чтобы покрывать текущие и будущие сценарии.
🔸 Поддержка DSL может быть трудозатратной, особенно если доменные действия часто меняются.
🔸 Строковые DSL работают как «фронтенд кода» — за ними скрывается движок, который тоже нужно развивать.
✅ Когда что выбрать
Если предметная область хорошо понятна и устойчива — стоит строить DSL.
Если действия ещё уточняются, а изменения происходят часто — лучше опираться на паттерны.
В сложных проектах возможен гибрид: паттерны для структуры и расширяемости, DSL для выражения бизнес-логики.
💬 А как у вас в проектах? Чаще используете паттерны или внедряете DSL?
👉 Читать статью
Библиотека пхпшника
#элементарный_выбор
В разработке часто встаёт вопрос: использовать ли DSL (Domain Specific Language) или опираться на дизайн-паттерны. Оба подхода помогают структурировать работу с данными и бизнес-логикой, но дают разный результат.
🔍 В чём разница
Паттерны делают код более гибким и слабо связанным, позволяют легко подменять компоненты. Но вместе с этим усложняют ментальную модель — приходится держать в голове фабрики, адаптеры и репозитории, а сама бизнес-логика может «растворяться» в слоях абстракций.
DSL описывает действия напрямую. Язык ближе к предметной области и проще для восприятия, особенно когда задачи сложные или действия цепочкой. Он позволяет выразить логику в явном виде и сократить количество лишних запросов и пост-обработки.
⚠️ Ограничения DSL
🔸 Создание DSL требует серьёзной подготовки: язык должен быть достаточно гибким, чтобы покрывать текущие и будущие сценарии.
🔸 Поддержка DSL может быть трудозатратной, особенно если доменные действия часто меняются.
🔸 Строковые DSL работают как «фронтенд кода» — за ними скрывается движок, который тоже нужно развивать.
✅ Когда что выбрать
Если предметная область хорошо понятна и устойчива — стоит строить DSL.
Если действия ещё уточняются, а изменения происходят часто — лучше опираться на паттерны.
В сложных проектах возможен гибрид: паттерны для структуры и расширяемости, DSL для выражения бизнес-логики.
💬 А как у вас в проектах? Чаще используете паттерны или внедряете DSL?
👉 Читать статью
Библиотека пхпшника
#элементарный_выбор
🛠️regexpbuilderphp — регулярные выражения, понятные человеку
Библиотека упрощает создание и делает их более читаемыми. Она подойдет для разработчиков, которые часто используют регулярки, но сложно ориентируются в их традиционном синтаксисе.
🔗Github
#инструменты
Библиотека упрощает создание и делает их более читаемыми. Она подойдет для разработчиков, которые часто используют регулярки, но сложно ориентируются в их традиционном синтаксисе.
🔗Github
#инструменты
🔥14❤1
How to: масштабировать до миллиарда документов в Symfony
Цены на бензин меняются по несколько раз в день. В итоге получается адский датасет: десятки гигабайт CSV и сотни тысяч записей цен за сутки. Если грузить это «как в SQL» (по документу на каждую цену), MongoDB быстро превращается в кладбище индексов и медленных агрегаций.
Как делают по-взрослому: сначала разбираем структуру данных (станции отдельно, цены отдельно), потом проектируем схему под запросы. Главный трюк — bucket pattern: складывать цены не по одной записи, а «ведрами» по станция + тип топлива + день, внутри хранить массив цен за день. Так документов становится в разы меньше, а дневные графики и «последнюю цену» можно доставать быстро.
Дальше — импорт не через «всё в память», а по дням: читаем CSV → временная коллекция → агрегация в bucket-документы → добавляем экстремумы (min/max) и предагрегаты (средние) → подтягиваем данные станции и денормализуем только то, что реально нужно.
👉 Читать статью
Цены на бензин меняются по несколько раз в день. В итоге получается адский датасет: десятки гигабайт CSV и сотни тысяч записей цен за сутки. Если грузить это «как в SQL» (по документу на каждую цену), MongoDB быстро превращается в кладбище индексов и медленных агрегаций.
Как делают по-взрослому: сначала разбираем структуру данных (станции отдельно, цены отдельно), потом проектируем схему под запросы. Главный трюк — bucket pattern: складывать цены не по одной записи, а «ведрами» по станция + тип топлива + день, внутри хранить массив цен за день. Так документов становится в разы меньше, а дневные графики и «последнюю цену» можно доставать быстро.
Дальше — импорт не через «всё в память», а по дням: читаем CSV → временная коллекция → агрегация в bucket-документы → добавляем экстремумы (min/max) и предагрегаты (средние) → подтягиваем данные станции и денормализуем только то, что реально нужно.
👉 Читать статью
🌚1
🧠 Rate Limiting — защита от перегрузки и злоупотреблений
🔹 Rate Limiting — это ограничение количества запросов, которое клиент может сделать за определённый период. Он предотвращает DoS-атаки, brute-force, резкий рост нагрузки и аварийные ситуации.
📌 В Laravel
Laravel имеет встроенную поддержку через middleware
✔️ ограничение на количество запросов за минуту/час;
✔️ разные лимиты для разных пользователей (по ID, API-ключу или IP);
✔️ кастомные сообщения об ошибке.
Пример стандартного ограничения:
```
🧾 Такой подход позволяет задавать разные лимиты для аутентифицированных и анонимных пользователей.
📌 В Symfony
Symfony тоже имеет встроенный Rate Limiter с разными алгоритмами (фиксированное окно, sliding window, token bucket). Он может быть применён к маршрутам через сервисы и конфигурацию.
⚠️ Но для защиты от реальных DoS-атак лучше комбинировать приложение с ограничением на уровне веб-сервера или прокси (NGINX, Cloudflare), поскольку встроенный rate limiter требует загрузки Symfony для каждого запроса.
Библиотека пхпшника
🔹 Rate Limiting — это ограничение количества запросов, которое клиент может сделать за определённый период. Он предотвращает DoS-атаки, brute-force, резкий рост нагрузки и аварийные ситуации.
📌 В Laravel
Laravel имеет встроенную поддержку через middleware
throttle, а также гибкий API для кастомных правил:✔️ ограничение на количество запросов за минуту/час;
✔️ разные лимиты для разных пользователей (по ID, API-ключу или IP);
✔️ кастомные сообщения об ошибке.
Пример стандартного ограничения:
Route::middleware(['throttle:60,1'])->group(function () {
Route::get('/posts', [PostController::class, 'index']);
});
🧾 Это ограничит пользователя до 60 запросов в минуту.
Для более гибкого контроля можно определить лимитер в App\Providers\RouteServiceProvider:
RateLimiter::for('api', function ($request) { return Limit::perMinute(100)->by($request->user()?->id ?: $request->ip());});```
🧾 Такой подход позволяет задавать разные лимиты для аутентифицированных и анонимных пользователей.
📌 В Symfony
Symfony тоже имеет встроенный Rate Limiter с разными алгоритмами (фиксированное окно, sliding window, token bucket). Он может быть применён к маршрутам через сервисы и конфигурацию.
⚠️ Но для защиты от реальных DoS-атак лучше комбинировать приложение с ограничением на уровне веб-сервера или прокси (NGINX, Cloudflare), поскольку встроенный rate limiter требует загрузки Symfony для каждого запроса.
Библиотека пхпшника
🥱4
Service Tags в Symfony: не про ивенты, а про архитектуру
Service tags в Symfony часто воспринимают как утилиту для Event Listener’ов и Twig-расширений. Это правда — но лишь малая часть картины. На практике tags — один из самых мощных архитектурных инструментов Symfony, если использовать их осознанно.
Статья как раз про это: не «как повесить тег», а как построить расширяемую систему без правок YAML и без условной логики — строго по Open-Closed Principle.
Ключевая идея
Мы собираем модульный Document Processing Pipeline:
PDF, CSV, JSON и любые новые форматы
добавление нового процессора = новый класс, без конфигов
Symfony 7.4, PHP 8.3+, атрибуты вместо YAML
Что здесь действительно важно
1. AutoconfigureTag на интерфейсе
Любая реализация автоматически попадает в систему. Никаких
2. TaggedIterator = современный Strategy
Типизированная коллекция сервисов, с ключами и приоритетами, без Compiler Pass’ов «по старинке».
3. defaultIndexMethod вместо магии
Ключ коллекции определяет сам сервис. Контейнер не знает доменной логики — и это правильно.
4. Кастомные атрибуты поверх тегов
Доменные метаданные (
5. TaggedLocator для ленивой загрузки
Ни один процессор не создаётся, пока он реально не нужен. Это критично для больших систем.
6. Compiler Pass как архитектурный guardrail
Контейнер валидирует систему на этапе сборки:
— дубли типов
— архитектурные инварианты
— ошибки ловятся до runtime
7. Абсолютный уровень декомпозиции
Даже чистые PHP-атрибуты без зависимости от Symfony можно «подключить» через
Домен остаётся чистым. Инфраструктура — умной.
Почему это ценно
✔️ расширение без модификации
✔️ ноль условной логики
✔️ высокая тестируемость
✔️ архитектурные ошибки ловятся на этапе сборки контейнера
👉 Читать статью
Библиотека пхпшника
Service tags в Symfony часто воспринимают как утилиту для Event Listener’ов и Twig-расширений. Это правда — но лишь малая часть картины. На практике tags — один из самых мощных архитектурных инструментов Symfony, если использовать их осознанно.
Статья как раз про это: не «как повесить тег», а как построить расширяемую систему без правок YAML и без условной логики — строго по Open-Closed Principle.
Ключевая идея
Мы собираем модульный Document Processing Pipeline:
PDF, CSV, JSON и любые новые форматы
добавление нового процессора = новый класс, без конфигов
Symfony 7.4, PHP 8.3+, атрибуты вместо YAML
Что здесь действительно важно
1. AutoconfigureTag на интерфейсе
Любая реализация автоматически попадает в систему. Никаких
services.yaml.2. TaggedIterator = современный Strategy
Типизированная коллекция сервисов, с ключами и приоритетами, без Compiler Pass’ов «по старинке».
3. defaultIndexMethod вместо магии
Ключ коллекции определяет сам сервис. Контейнер не знает доменной логики — и это правильно.
4. Кастомные атрибуты поверх тегов
Доменные метаданные (
type, priority) живут в атрибуте, а не в конфиге. Код становится декларативным и читаемым.5. TaggedLocator для ленивой загрузки
Ни один процессор не создаётся, пока он реально не нужен. Это критично для больших систем.
6. Compiler Pass как архитектурный guardrail
Контейнер валидирует систему на этапе сборки:
— дубли типов
— архитектурные инварианты
— ошибки ловятся до runtime
7. Абсолютный уровень декомпозиции
Даже чистые PHP-атрибуты без зависимости от Symfony можно «подключить» через
registerAttributeForAutoconfiguration.Домен остаётся чистым. Инфраструктура — умной.
Почему это ценно
✔️ расширение без модификации
✔️ ноль условной логики
✔️ высокая тестируемость
✔️ архитектурные ошибки ловятся на этапе сборки контейнера
👉 Читать статью
Библиотека пхпшника
❤1👍1
В Laravel с версии 10.7 появилась поддержка конвейера для процессов, который легко позволяет связывать вывод одного процесса с входными данными для другого.
Библиотека пхпшника
#vardump
Библиотека пхпшника
#vardump
❤11
Forwarded from Книги для программистов
Если ты знаешь синтаксис, но на словах «графы» и «динамика» начинаешь гуглить — это норм. Эта книга как раз про переход от «я пишу код» к «я понимаю, что делаю».
Второе издание учит алгоритмическому мышлению через задачи из спортивного программирования. Без высшей математики и абстрактной теории. Задача → варианты решений → выбор лучшего.
Что прокачиваешь:
Почему это полезно:
Кому подойдёт:
Скачать
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4
💻 Подборка новостей по PHP за неделю:
🔹 Laravel 12.49.0 — в коллекциях появился метод
🔹 NativePHP for Mobile — бесплатно — объявлен релиз NativePHP Air, а мобильная версия NativePHP стала полностью бесплатной, вместе с рядом улучшений экосистемы и платформы.
🔹 Laravel VS Code Extension 1.5.0 — улучшена поддержка Livewire 4 и Blade: более точный парсинг, автодополнение и IntelliSense для современных Laravel-проектов.
🔹 Statamic 6 — состоялся официальный релиз новой версии CMS: обновлённая админ-панель и современный фронтенд-стек.
🔹 Symfony 26 января — 1 февраля — активное развитие Symfony 8.1, а также выпущены версии 5.4.51, 6.4.33, 7.3.11, 7.4.5 и 8.0.5 для устранения потенциальной уязвимости и усиления безопасности.
Библиотека пхпшника
#свежак
🔹 Laravel 12.49.0 — в коллекциях появился метод
hasSole() для проверки наличия ровно одного подходящего элемента. Также добавлена поддержка between с подзапросами, сохранение ключей в fluent resource collections и работа с датой/временем в команде maintenance mode.🔹 NativePHP for Mobile — бесплатно — объявлен релиз NativePHP Air, а мобильная версия NativePHP стала полностью бесплатной, вместе с рядом улучшений экосистемы и платформы.
🔹 Laravel VS Code Extension 1.5.0 — улучшена поддержка Livewire 4 и Blade: более точный парсинг, автодополнение и IntelliSense для современных Laravel-проектов.
🔹 Statamic 6 — состоялся официальный релиз новой версии CMS: обновлённая админ-панель и современный фронтенд-стек.
🔹 Symfony 26 января — 1 февраля — активное развитие Symfony 8.1, а также выпущены версии 5.4.51, 6.4.33, 7.3.11, 7.4.5 и 8.0.5 для устранения потенциальной уязвимости и усиления безопасности.
Библиотека пхпшника
#свежак
🗂️ Сохранение нескольких моделей
Знаете ли вы, что Laravel позволяет сохранять сразу несколько связанных моделей с помощью метода
Библиотека пхпшника
#vardump
Знаете ли вы, что Laravel позволяет сохранять сразу несколько связанных моделей с помощью метода
saveMany 🚀Библиотека пхпшника
#vardump
❤2
Почему вы должны указывать тип данных в массивах в PHP
Статья обсуждает важность и преимущества использования типов массивов в PHP для повышения ясности кода, улучшения автодополнения в IDE и улучшения статического анализа.
👉 Читать
Библиотека пхпшника
Статья обсуждает важность и преимущества использования типов массивов в PHP для повышения ясности кода, улучшения автодополнения в IDE и улучшения статического анализа.
👉 Читать
Библиотека пхпшника
Proglib ищет эксперта для ведения PHP-каналов. Нам нужен автор, который глубоко погружён в индустрию и пишет для опытных разработчиков.
🐘 ЗАДАЧИ:
➡️ Вести три канала о PHP: основной, задачи и собеседования.
➡️ Создавать контент Middle+: архитектура, оптимизация, разбор RFC, кейсы Laravel/Symfony.
➡️ Готовить задачи и вопросы для интервью с качественным разбором решений.
➡️ Работать с аналитикой: отслеживать метрики (охваты, ERR) и корректировать контент-план.
➡️ Мониторить комьюнити и оперативно упаковывать тренды в посты.
🎯 ТРЕБОВАНИЯ:
➡️ PHP Middle+: понимание работы движка, паттернов и экосистемы.
➡️ Стиль: умение писать для профи — ёмко, аргументированно и без воды.
➡️ Инструменты: уверенное владение нейросетями для ускорения работы.
➡️ Самостоятельность: вы сами находите темы и отвечаете за качество.
✨ УСЛОВИЯ:
📍 Удалёнка, гибкий график, частичная занятость.
📍 Сдельная оплата за количество задач.
📍 Аудитория — тысячи профильных разработчиков.
👉 Оставляйте отклик, и мы свяжемся с вами!
🎯 ТРЕБОВАНИЯ:
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
Forwarded from Библиотека задач по PHP | тесты, код, задания
🔒 Symfony: Lock vs Semaphore — когда и что выбрать?
В разработке многозадачных PHP-приложений часто возникает необходимость контролировать доступ к общим ресурсам. Symfony предоставляет два мощных инструмента для этой цели: Lock и Semaphore. Хотя оба компонента служат для синхронизации процессов, их подходы и области применения существенно различаются.
🔐 Lock — эксклюзивный доступ
Lock обеспечивает исключительный доступ к ресурсу:
🔸Один процесс — один доступ: только один процесс может получить «ключ» к ресурсу в любой момент времени.
🔸Идеально для критических секций: обновление файлов, обработка платежей, изменение данных в базе данных.
🔸Простая модель: либо у вас есть доступ, либо вы ждёте.
🚦 Semaphore — ограниченный параллелизм
Semaphore позволяет контролировать количество одновременно работающих процессов:
🔸Ограниченное количество разрешений: каждый процесс «потребляет» одно разрешение.
🔸Идеально для ограничения параллелизма: обработка изображений, API-запросы, очереди задач.
🔸Модель «ограниченного доступа»: несколько процессов могут работать одновременно, но не более заданного лимита.
🧠 Когда использовать что?
Lock: используйте, когда необходимо обеспечить, чтобы только один процесс выполнял задачу в определённый момент времени.
Semaphore: используйте, когда нужно ограничить количество одновременно выполняющихся процессов, например, для предотвращения перегрузки системы.
📚 Документация:
Symfony Lock
Symfony Semaphore
🐸 Библиотека пхпшника
#элементарный_выбор
В разработке многозадачных PHP-приложений часто возникает необходимость контролировать доступ к общим ресурсам. Symfony предоставляет два мощных инструмента для этой цели: Lock и Semaphore. Хотя оба компонента служат для синхронизации процессов, их подходы и области применения существенно различаются.
🔐 Lock — эксклюзивный доступ
Lock обеспечивает исключительный доступ к ресурсу:
🔸Один процесс — один доступ: только один процесс может получить «ключ» к ресурсу в любой момент времени.
🔸Идеально для критических секций: обновление файлов, обработка платежей, изменение данных в базе данных.
🔸Простая модель: либо у вас есть доступ, либо вы ждёте.
🚦 Semaphore — ограниченный параллелизм
Semaphore позволяет контролировать количество одновременно работающих процессов:
🔸Ограниченное количество разрешений: каждый процесс «потребляет» одно разрешение.
🔸Идеально для ограничения параллелизма: обработка изображений, API-запросы, очереди задач.
🔸Модель «ограниченного доступа»: несколько процессов могут работать одновременно, но не более заданного лимита.
🧠 Когда использовать что?
Lock: используйте, когда необходимо обеспечить, чтобы только один процесс выполнял задачу в определённый момент времени.
Semaphore: используйте, когда нужно ограничить количество одновременно выполняющихся процессов, например, для предотвращения перегрузки системы.
📚 Документация:
Symfony Lock
Symfony Semaphore
#элементарный_выбор
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1👍1
Instructor
Библиотека для структурированной экстракции данных на PHP, основанная на LLM. Создан для простоты, прозрачности и контроля.
Пример показывает, как инструктор извлекает структурированную информацию из предоставленного текста (или последовательности сообщений в чате).
🔗 Github
#инструменты
Библиотека для структурированной экстракции данных на PHP, основанная на LLM. Создан для простоты, прозрачности и контроля.
Пример показывает, как инструктор извлекает структурированную информацию из предоставленного текста (или последовательности сообщений в чате).
🔗 Github
#инструменты
😁1
🚀 Как ускорить массовую отправку HTTP-запросов в PHP
🔍 Постановка задачи:
Есть скрипт на PHP, который должен отправлять множество HTTP-запросов. Нужно сделать это как можно быстрее. Очевидное решение — параллельная отправка.
🔧 Шаг 1: последовательная обработка
Простой цикл с
⚙️ Шаг 2: повторное использование curl-хэндла
Инициализируем
⚡ Шаг 3: параллельная отправка с curl_multi_
Используем
📦 Шаг 4: отправка батчами (batching)
Если запросов сотни или тысячи, одновременно всё не потянет даже мощный сервер. Решение — отправка пакетами, например по 3. Это позволяет контролировать нагрузку. В нашем примере — ~0.8 секунды на 10 запросов.
🔗 Читать статью
Библиотека пхпшника #буст
🔍 Постановка задачи:
Есть скрипт на PHP, который должен отправлять множество HTTP-запросов. Нужно сделать это как можно быстрее. Очевидное решение — параллельная отправка.
🔧 Шаг 1: последовательная обработка
Простой цикл с
curl_init() и curl_exec() на каждый URL. Результат: 10 запросов выполняются за ~4.4 секунды.⚙️ Шаг 2: повторное использование curl-хэндла
Инициализируем
curl один раз и переиспользуем. Время выполнения снижается до ~1.7 секунды.⚡ Шаг 3: параллельная отправка с curl_multi_
Используем
curl_multi_init() и запускаем запросы одновременно. Итог: всего 0.5 секунды на 10 запросов. Почти в 9 раз быстрее, чем изначально.📦 Шаг 4: отправка батчами (batching)
Если запросов сотни или тысячи, одновременно всё не потянет даже мощный сервер. Решение — отправка пакетами, например по 3. Это позволяет контролировать нагрузку. В нашем примере — ~0.8 секунды на 10 запросов.
🔗 Читать статью
Библиотека пхпшника #буст
🔥6❤2🥱2