⚖️ whereHas() vs whereRelation() в Laravel
короче — не значит понятнее
Laravel-разработчики любят шорткаты. Меньше кода, меньше шума — приятно.
Но в реальных проектах с командой и постоянно меняющимися требованиями выигрывает ясность, а не длина строки.
Часто советуют заменить
Формально — да, код короче.
Практически — не всё так радужно.
🧠 В чём реальная разница
С первого взгляда понятно:
🔸фильтрация по relation
🔸логика живёт внутри профиля
🔸условия легко расширяются
🔸запрос честно отражает намерение
Читается как фильтр по колонке
Но на деле — это подзапрос к связанной таблице.
❗️ Это вводит в заблуждение, особенно при чтении чужого кода.
🧩 Масштабирование условий
С
С whereRelation():
🔸либо цепочка вызовов
🔸либо возврат к
🔸либо каша из стилей
🔍 Поиск и поддержка кода
Реальный кейс:
«Эндпоинт тормозит, ищем фильтрацию по отношениям»
Для поддержки и отладки это критично.
⚙️ Производительность — миф
Под капотом — тот же whereHas() и почти идентичный SQL.
Если медленно:
🔸нет индексов
🔸не тот подход к запросу
Метод тут ни при чём.
🧱 Проблема консистентности
Что происходит в проектах:
1. Сначала
2. Потом требования растут
3. Появляется
4. В коде — два стиля без причины
5. В ревью — споры
Если сразу использовать
🔸один паттерн
🔸единый стиль
🔸код готов к росту
🧠 Внутренности Laravel
Без магии:
Не умнее. Не быстрее. Просто без closure.
📌 Правило на практике
Можно whereRelation(), если:
🔸один простой фильтр
🔸скрипт, отчёт, админка
🔸логика точно не вырастет
Лучше whereHas(), если:
🔸бизнес-логика
🔸командная разработка
🔸код придётся читать и менять
Экономия пары символов — плохой аргумент.
Пишите код для того, кто откроет файл через полгода.
В реальных проектах честный
👉 Ссылка на статью
Библиотека пхпшника
#элементарный_выбор
короче — не значит понятнее
Laravel-разработчики любят шорткаты. Меньше кода, меньше шума — приятно.
Но в реальных проектах с командой и постоянно меняющимися требованиями выигрывает ясность, а не длина строки.
Часто советуют заменить
whereHas() на whereRelation():// было
User::whereHas('profile', function ($q) {
$q->where('is_verified', false);
})->get();
// стало
User::whereRelation('profile', 'is_verified', false)->get();
Формально — да, код короче.
Практически — не всё так радужно.
🧠 В чём реальная разница
whereHas() — явно про отношенияUser::query()
->whereHas('profile', fn ($q) => $q->where('is_verified', false))
->get();
С первого взгляда понятно:
🔸фильтрация по relation
🔸логика живёт внутри профиля
🔸условия легко расширяются
🔸запрос честно отражает намерение
whereRelation() — скрывает сложностьUser::whereRelation('profile', 'is_verified', false)->get();Читается как фильтр по колонке
users.Но на деле — это подзапрос к связанной таблице.
❗️ Это вводит в заблуждение, особенно при чтении чужого кода.
🧩 Масштабирование условий
С
whereHas() — естественно и прозрачно:->whereHas('profile', fn ($q) => $q
->where('is_verified', false)
->whereNotNull('phone')
->where('age', '>', 18)
)С whereRelation():
🔸либо цепочка вызовов
🔸либо возврат к
whereHas()🔸либо каша из стилей
🔍 Поиск и поддержка кода
Реальный кейс:
«Эндпоинт тормозит, ищем фильтрацию по отношениям»
whereHas() — легко найти поискомwhereRelation() — прячется среди обычных whereДля поддержки и отладки это критично.
⚙️ Производительность — миф
whereRelation() не быстрее.Под капотом — тот же whereHas() и почти идентичный SQL.
Если медленно:
🔸нет индексов
🔸не тот подход к запросу
Метод тут ни при чём.
🧱 Проблема консистентности
Что происходит в проектах:
1. Сначала
whereRelation() — «быстро и красиво»2. Потом требования растут
3. Появляется
whereHas()4. В коде — два стиля без причины
5. В ревью — споры
Если сразу использовать
whereHas():🔸один паттерн
🔸единый стиль
🔸код готов к росту
🧠 Внутренности Laravel
Без магии:
whereRelation() — это обёртка над whereHas().Не умнее. Не быстрее. Просто без closure.
📌 Правило на практике
Можно whereRelation(), если:
🔸один простой фильтр
🔸скрипт, отчёт, админка
🔸логика точно не вырастет
Лучше whereHas(), если:
🔸бизнес-логика
🔸командная разработка
🔸код придётся читать и менять
Экономия пары символов — плохой аргумент.
Пишите код для того, кто откроет файл через полгода.
В реальных проектах честный
whereHas() почти всегда выигрывает.👉 Ссылка на статью
Библиотека пхпшника
#элементарный_выбор
❤4👍2🥱1
🔍 Can I PHP: проверяем доступность фичи налету
Расширение позволяет проверить доступность определенной функции/метода в различных версиях PHP и получить краткое описание возможностей.
👉 Сайт
#инструменты
Расширение позволяет проверить доступность определенной функции/метода в различных версиях PHP и получить краткое описание возможностей.
👉 Сайт
#инструменты
❤2
How to: правильно обрабатывать ошибки валидации в Symfony
DTO +
Но ошибки валидации по умолчанию — шумные, разные по формату и неудобные для фронта.
Из-за этого часто появляются:
✅ Правильный подход
Пусть валидация падает сама, а форматирование ошибок происходит глобально, один раз.
Это решает Symfony Validation Response Bundle:
🔹 перехватывает ошибки из
🔹 возвращает чистый JSON;
🔹 единый формат для всех эндпоинтов;
🔹 без логики в контроллерах.
🚀 Быстрый старт
Без конфигурации. Есть
👉 Подробный разбор и примеры — в статье.
Библиотека пхпшника
DTO +
#[MapRequestPayload] в Symfony выглядят отлично.Но ошибки валидации по умолчанию — шумные, разные по формату и неудобные для фронта.
Из-за этого часто появляются:
🔸 try/catch в контроллерах🔸 дублирующийся маппинг ошибок🔸 хаос в API-ответах✅ Правильный подход
Пусть валидация падает сама, а форматирование ошибок происходит глобально, один раз.
Это решает Symfony Validation Response Bundle:
🔹 перехватывает ошибки из
#[MapRequestPayload], #[MapQueryString], #[MapUploadedFile];🔹 возвращает чистый JSON;
🔹 единый формат для всех эндпоинтов;
🔹 без логики в контроллерах.
🚀 Быстрый старт
composer require soleinjast/symfony-validation-responseБез конфигурации. Есть
simple, RFC7807 и кастомные форматтеры.👉 Подробный разбор и примеры — в статье.
Библиотека пхпшника
⌨️ Топ-вакансий по PHP за неделю
PHP разработчик — от 170 000 до 240 000 ₽, Удалёнка (Москва)
Middle+ / Senior Laravel разработчик — от 2200 до 3000 $, Удаленка (Москва)
Веб-программист PHP — 200 000 до 300 000 ₽, Удаленка (Москва)
➡️ Еще больше топовых вакансий — в нашем канале PHP Jobs
PHP разработчик — от 170 000 до 240 000 ₽, Удалёнка (Москва)
Middle+ / Senior Laravel разработчик — от 2200 до 3000 $, Удаленка (Москва)
Веб-программист PHP — 200 000 до 300 000 ₽, Удаленка (Москва)
➡️ Еще больше топовых вакансий — в нашем канале PHP Jobs
Roadmap: Внедрение ИИ-агентов в PHP-приложения
ИИ-агенты — это новый стандарт автоматизации бэкенда. Разработчикам на
Этапы обучения:
— изучение принципов взаимодействия с языковыми моделями через
— проектирование агентской логики: инструменты, память, планирование;
— интеграция мультиагентных систем в веб-сервисы;
— оптимизация работы агентов для решения бизнес-задач.
Курс «Разработка ИИ-агентов» проведёт вас от теории до реализации готовых ИИ-решений.
Стать AI-разработчиком
До 19 января действует акция «3 в 1»: купите один курс — два получите бесплатно.
ИИ-агенты — это новый стандарт автоматизации бэкенда. Разработчикам на
PHP пора осваивать архитектуру автономных систем для расширения возможностей своих проектов.Этапы обучения:
— изучение принципов взаимодействия с языковыми моделями через
API;— проектирование агентской логики: инструменты, память, планирование;
— интеграция мультиагентных систем в веб-сервисы;
— оптимизация работы агентов для решения бизнес-задач.
Курс «Разработка ИИ-агентов» проведёт вас от теории до реализации готовых ИИ-решений.
Стать AI-разработчиком
До 19 января действует акция «3 в 1»: купите один курс — два получите бесплатно.
😁1
Yii3. Официальный релиз
Это случилось! Yii3 официально выпущен после многих лет интенсивной разработки и полировки.
🔗 Хабр
Библиотека пхпшника
Это случилось! Yii3 официально выпущен после многих лет интенсивной разработки и полировки.
🔗 Хабр
Библиотека пхпшника
🎉32😁12
🧠 Отключайте логирование SQL при тяжёлых запросах
🧠 Суть проблемы
Когда вы выполняете много SQL-запросов, особенно в пакетных операциях (импорт больших объёмов данных, миграции, мигрейт-скрипты), ORM может логировать каждый запрос.
Такое логирование полезно при отладке, но в рабочих сценариях оно:
⚡ генерирует огромное количество записей в памяти,
⚡ может привести к утечкам памяти (memory leak) при Doctrine, если логгер накапливает записи,
⚡ увеличивает время выполнения операции, так как обработка логов сама по себе не бесплатна.
Почему отключать логирование полезно
🔹 При больших импортных задачах или миграциях сотни тысяч запросов могут накапливаться в логере — это вызывает рост потребления памяти и может привести к «зависанию» процесса.
🔹 Если логирование не нужно в этом контексте, его отключение убирает ненужную нагрузку и ускоряет выполнение операций.
🔹 Это особенно важно на production-задачах, где производительность имеет приоритет над подробным аудитом запросов.
🛠️ Как отключить логирование в разных экосистемах
🟦 Laravel (Eloquent / Query Logging)
Laravel логирует запросы, если включён режим отладки или уровень логов очень подробный.
Чтобы уменьшить SQL-логирование, в
Это снизит объём логов, не выводя SQL-запросы по умолчанию (они обычно логируются на уровне debug).
Если же вы используете кастомный логгер запросов — отключите его в продакшене.
🟩 Symfony / Doctrine ORM
Doctrine по умолчанию может логировать SQL через SQLLogger (особенно в dev-режиме).
Для отключения логгера Doctrine:
Это полностью выключит SQL-логирование для этого соединения.
Такой подход особенно полезен при массовых операциях, например в консольных командах или миграциях.
💡 Значение
⚠️ В более новой версии Doctrine SQLLogger был заменён системой middlewares, и для полного отключения придётся убирать middleware-логгеры — см. документацию.
📌 Пример использования в консоли (Symfony)
Если у вас есть импорты/массовая обработка в консольной команде — отключите логгер в начале:
Такой трюк помогает избежать накопления большого количества логов в памяти и снижает риски OOM (Out Of Memory).
🧠 Когда это стоит делать
✅ Тяжёлые операции с данными: импорт/экспорт больших таблиц, миграции
✅ Длительные фоновые задачи в очередях/консоли
✅ Прод-окружение, где логи не нужны для каждого SQL-запроса
⚠️ Когда не стоит отключать
❗ Если вы на этапе отладки и хотите видеть каждый запрос для оптимизации
❗ Если нужно собирать подробную аналитику SQL-вызовов
❗ Если у вас разработка и подробные логи помогают тестировать логику
Библиотека пхпшника
🧠 Суть проблемы
Когда вы выполняете много SQL-запросов, особенно в пакетных операциях (импорт больших объёмов данных, миграции, мигрейт-скрипты), ORM может логировать каждый запрос.
Такое логирование полезно при отладке, но в рабочих сценариях оно:
⚡ генерирует огромное количество записей в памяти,
⚡ может привести к утечкам памяти (memory leak) при Doctrine, если логгер накапливает записи,
⚡ увеличивает время выполнения операции, так как обработка логов сама по себе не бесплатна.
Почему отключать логирование полезно
🔹 При больших импортных задачах или миграциях сотни тысяч запросов могут накапливаться в логере — это вызывает рост потребления памяти и может привести к «зависанию» процесса.
🔹 Если логирование не нужно в этом контексте, его отключение убирает ненужную нагрузку и ускоряет выполнение операций.
🔹 Это особенно важно на production-задачах, где производительность имеет приоритет над подробным аудитом запросов.
🛠️ Как отключить логирование в разных экосистемах
🟦 Laravel (Eloquent / Query Logging)
Laravel логирует запросы, если включён режим отладки или уровень логов очень подробный.
Чтобы уменьшить SQL-логирование, в
.env:APP_DEBUG=falseLOG_LEVEL=infoЭто снизит объём логов, не выводя SQL-запросы по умолчанию (они обычно логируются на уровне debug).
Если же вы используете кастомный логгер запросов — отключите его в продакшене.
🟩 Symfony / Doctrine ORM
Doctrine по умолчанию может логировать SQL через SQLLogger (особенно в dev-режиме).
Для отключения логгера Doctrine:
$emConfig = $entityManager->getConnection()->getConfiguration();$emConfig->setSQLLogger(null);Это полностью выключит SQL-логирование для этого соединения.
Такой подход особенно полезен при массовых операциях, например в консольных командах или миграциях.
💡 Значение
null удаляет логгер, и Doctrine перестаёт накапливать записи о каждом выполненном SQL.⚠️ В более новой версии Doctrine SQLLogger был заменён системой middlewares, и для полного отключения придётся убирать middleware-логгеры — см. документацию.
📌 Пример использования в консоли (Symfony)
Если у вас есть импорты/массовая обработка в консольной команде — отключите логгер в начале:
public function execute(InputInterface $input, OutputInterface $output): int
{
$config = $this->entityManager->getConnection()->getConfiguration();
$config->setSQLLogger(null);
// дальнейшая обработка
}
Такой трюк помогает избежать накопления большого количества логов в памяти и снижает риски OOM (Out Of Memory).
🧠 Когда это стоит делать
✅ Тяжёлые операции с данными: импорт/экспорт больших таблиц, миграции
✅ Длительные фоновые задачи в очередях/консоли
✅ Прод-окружение, где логи не нужны для каждого SQL-запроса
⚠️ Когда не стоит отключать
❗ Если вы на этапе отладки и хотите видеть каждый запрос для оптимизации
❗ Если нужно собирать подробную аналитику SQL-вызовов
❗ Если у вас разработка и подробные логи помогают тестировать логику
Библиотека пхпшника
👍4
Небольшой совет по PHP, который сэкономит время (и строки кода)
Недавно при ревью PHP-проекта всё работало идеально: тесты зелёные, багов нет.
Но в глаза бросилось другое — один и тот же шаблон в каждом конструкторе(фото 1)
Технически всё корректно.
Практически — это рутина.
Когда в проекте:
— десятки классов
— по 5–10 свойств в каждом
вы постоянно пишете один и тот же бойлерплейт. Это шум, а не логика.
Что изменилось с PHP 8.0
В PHP 8.0 появился Constructor Property Promotion.
Он позволяет объявлять и инициализировать свойства прямо в конструкторе(фото 2)
Результат:
— нет отдельных свойств
— нет
— поведение то же
— кода меньше
— читать быстрее
Мозг фокусируется на зависимостях класса, а не на механике.
Видимость — любая
Работает ровно так, как ожидается.
Реальный эффект на проекте
В одном Laravel-сервисе было 12 свойств.
Конструктор — ~30 строк.
После рефакторинга:
— 6 строк
— логика не изменилась
— код стало проще ревьюить
Времени: ~2 минуты (multi-cursor в VS Code).
Когда стоит использовать
Используйте promotion, если:
— свойства задаются только в конструкторе
— нет дополнительной логики при присваивании
— хотите чистый, современный PHP
Когда не стоит
Не используйте, если:
— нужна валидация
— вы трансформируете значение
— важно явно показать логику инициализации
Здесь старый способ — осознанно лучше.
🔗 Ссылка на статью
Библиотека пхпшника
Недавно при ревью PHP-проекта всё работало идеально: тесты зелёные, багов нет.
Но в глаза бросилось другое — один и тот же шаблон в каждом конструкторе(фото 1)
Технически всё корректно.
Практически — это рутина.
Когда в проекте:
— десятки классов
— по 5–10 свойств в каждом
вы постоянно пишете один и тот же бойлерплейт. Это шум, а не логика.
Что изменилось с PHP 8.0
В PHP 8.0 появился Constructor Property Promotion.
Он позволяет объявлять и инициализировать свойства прямо в конструкторе(фото 2)
Результат:
— нет отдельных свойств
— нет
$this->name = $name— поведение то же
— кода меньше
— читать быстрее
Мозг фокусируется на зависимостях класса, а не на механике.
Видимость — любая
class Post
{
public function __construct(
public string $noscript,
public string $content,
private int $authorId
) {}
}
Работает ровно так, как ожидается.
Реальный эффект на проекте
В одном Laravel-сервисе было 12 свойств.
Конструктор — ~30 строк.
После рефакторинга:
— 6 строк
— логика не изменилась
— код стало проще ревьюить
Времени: ~2 минуты (multi-cursor в VS Code).
Когда стоит использовать
Используйте promotion, если:
— свойства задаются только в конструкторе
— нет дополнительной логики при присваивании
— хотите чистый, современный PHP
Когда не стоит
Не используйте, если:
— нужна валидация
— вы трансформируете значение
— важно явно показать логику инициализации
Здесь старый способ — осознанно лучше.
Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱12❤7
Иногда вам может потребоваться убедиться, что строка заканчивается определенным символом, например косой чертой или точкой. Laravel поставляется с помощником
Библиотека пхпшника
#vardump
finish, который позволяет сделать это 🚀.Библиотека пхпшника
#vardump
🥱10👍6
«Этот манёвр будет стоить нам 51 год...»
Если вы застряли на поддержке легаси, пора делать манёвр в сторону архитектуры и алгоритмов. Это единственный путь к масштабным проектам и высоким зарплатам.
До понедельника все курсы Proglib Academy доступны по старой цене:
— Разработка ИИ-агентов
— Математика для разработки AI-моделей
— ML для старта в Data Science
— Математика для Data Science
— Специалист по ИИ
— Алгоритмы и структуры данных
— Программирование на Python
— Основы IT для непрограммистов
— Архитектуры и шаблоны проектирования
Успеть забрать со скидкой
⚠️ Дедлайн — 19 января
Если вы застряли на поддержке легаси, пора делать манёвр в сторону архитектуры и алгоритмов. Это единственный путь к масштабным проектам и высоким зарплатам.
До понедельника все курсы Proglib Academy доступны по старой цене:
— Разработка ИИ-агентов
— Математика для разработки AI-моделей
— ML для старта в Data Science
— Математика для Data Science
— Специалист по ИИ
— Алгоритмы и структуры данных
— Программирование на Python
— Основы IT для непрограммистов
— Архитектуры и шаблоны проектирования
Успеть забрать со скидкой
⚠️ Дедлайн — 19 января
🎄 Новый год прошёл — возвращаемся в рабочий режим
Декабрь был рваным: дедлайны, релизы «перед праздниками», хотфиксы между салатами и попытки не сломать прод на последнем деплое года. Теперь это уже история — самое время спокойно разобрать, что реально произошло и что делать дальше.
Предлагаем в этой ветке дополнительно обсудить:
🎯 что из запланированного на декабрь так и не взлетело — и почему
📉 какие технические долги утащили с собой в январь
📈 какие решения неожиданно сработали лучше ожиданий
🧪 что хотите переписать, выкинуть или зафиксить в первом квартале
🚀 планы на 2026: стек, архитектура, апгрейды, эксперименты
Новый год — удобная точка не для «мотивационных обещаний», а для холодного инженерного пересмотра: что масштабируется, что тормозит команду, а что пора честно признать ошибкой.
👇 Пишите, с чем вы вошли в январь — и куда собираетесь двигаться дальше.
Библиотека пхпшника
Декабрь был рваным: дедлайны, релизы «перед праздниками», хотфиксы между салатами и попытки не сломать прод на последнем деплое года. Теперь это уже история — самое время спокойно разобрать, что реально произошло и что делать дальше.
Предлагаем в этой ветке дополнительно обсудить:
🎯 что из запланированного на декабрь так и не взлетело — и почему
📉 какие технические долги утащили с собой в январь
📈 какие решения неожиданно сработали лучше ожиданий
🧪 что хотите переписать, выкинуть или зафиксить в первом квартале
🚀 планы на 2026: стек, архитектура, апгрейды, эксперименты
Новый год — удобная точка не для «мотивационных обещаний», а для холодного инженерного пересмотра: что масштабируется, что тормозит команду, а что пора честно признать ошибкой.
👇 Пишите, с чем вы вошли в январь — и куда собираетесь двигаться дальше.
Библиотека пхпшника
💻 Подборка новостей по PHP за неделю:
🔹 Laravel: официальная AI-документация — в документации Laravel 12.x появился раздел AI Assisted Development с рекомендациями по эффективному использованию AI-инструментов при разработке Laravel-приложений.
🔹 Filament v4.5 — вышло обновление админ-панели с улучшениями из версий 4.4 и 4.5: доработки UX, новые возможности компонентов и дальнейшая шлифовка стабильности.
🔹 Claude Code Simplifier для Laravel — Тейлор Отвелл выпустил плагин для Claude Code, который автоматизирует упрощение и чистку Laravel/PHP-кода прямо в рабочем процессе.
🔹 Laravel 12.45.1–12.46.0 — добавлены новые хелперы для массивов и коллекций, улучшена авторизация Gate с поддержкой enum, а также включены важные багфиксы.
🔹 Symfony 5–11 января — фокус на исправлении багов и обновлении тестов под новые версии PHPUnit. В Symfony 8.1 начали появляться новые фичи, а Symfony UX представил новый Toolkit-пакет.
Библиотека пхпшника
#свежак
🔹 Laravel: официальная AI-документация — в документации Laravel 12.x появился раздел AI Assisted Development с рекомендациями по эффективному использованию AI-инструментов при разработке Laravel-приложений.
🔹 Filament v4.5 — вышло обновление админ-панели с улучшениями из версий 4.4 и 4.5: доработки UX, новые возможности компонентов и дальнейшая шлифовка стабильности.
🔹 Claude Code Simplifier для Laravel — Тейлор Отвелл выпустил плагин для Claude Code, который автоматизирует упрощение и чистку Laravel/PHP-кода прямо в рабочем процессе.
🔹 Laravel 12.45.1–12.46.0 — добавлены новые хелперы для массивов и коллекций, улучшена авторизация Gate с поддержкой enum, а также включены важные багфиксы.
🔹 Symfony 5–11 января — фокус на исправлении багов и обновлении тестов под новые версии PHPUnit. В Symfony 8.1 начали появляться новые фичи, а Symfony UX представил новый Toolkit-пакет.
Библиотека пхпшника
#свежак
👍1
✅Автозаполнение вводимых команд в Laravel
При создании опций для CLI-приложений вы можете улучшить UX, реализовав автозаполнение для пользователя. Это можно сделать с помощью метода anticipate, предоставляемого Laravel 🚀
Библиотека пхпшника
#vardump
При создании опций для CLI-приложений вы можете улучшить UX, реализовав автозаполнение для пользователя. Это можно сделать с помощью метода anticipate, предоставляемого Laravel 🚀
Библиотека пхпшника
#vardump
👍9
echo $old_price; // deprecatedЗавтра стоимость всех курсов Proglib.academy вырастет. Залетайте в обучение сегодня, чтобы успеть до планового обновления прайса.
Залить качественную обнову в скиллы
Проект начинался как обычное PHP-приложение, а закончился полностью автоматизированным CI/CD-пайплайном для PHP-микросервисов.
По дороге — YAML-ад, конфликты портов, падения пайплайнов и неожиданные различия macOS vs Linux.
🧱 Что строилось
PHP 8.2 (FPM) — backend-сервисы
Nginx — reverse proxy / API Gateway
MySQL + Redis — данные
Docker Compose — оркестрация
GitHub Actions — CI/CD
Prometheus + Grafana — мониторинг
Жёстко зафиксированные порты:
💥 Что сломалось первым
Docker Compose:
Конфликты портов → без документации сервисы воюют
GitHub Actions:
CRLF vs LF → пайплайн падает из-за line endings
🔧 Что в итоге сработало
Переменные окружения + дефолты по портам
Healthchecks на уровне Docker и CI
Fallback-логика для
Отдельный скрипт проверки живости сервисов
Мониторинг не «потом», а сразу
🧠 Ключевые выводы
Infrastructure as Code ≠ магия — тестируется и ревьюится как код
CI/CD — это быстрый фидбек, а не просто «зелёная галочка»
Порты — ограниченный ресурс, их нужно резервировать заранее
12-Factor App работает и для DevOps, не только для приложений
Наблюдаемость важнее героизма при падении продакшена
🚀 Прод
Zero-downtime deploy
Масштабирование сервисов
Бэкапы перед обновлением
Автоматическая проверка состояния
Это не история про «идеальный стек».
Это история про боль → дисциплину → устойчивую систему.
💬 А как вы решаете конфликты портов?
👉 Ссылка на статью
Библиотека пхпшника
По дороге — YAML-ад, конфликты портов, падения пайплайнов и неожиданные различия macOS vs Linux.
🧱 Что строилось
PHP 8.2 (FPM) — backend-сервисы
Nginx — reverse proxy / API Gateway
MySQL + Redis — данные
Docker Compose — оркестрация
GitHub Actions — CI/CD
Prometheus + Grafana — мониторинг
Жёстко зафиксированные порты:
9000 / 9001 / 8081 / 3000 / 9090💥 Что сломалось первым
Docker Compose:
services must be a mapping → YAML не прощает отступыКонфликты портов → без документации сервисы воюют
GitHub Actions:
.env.example есть локально, но не в GitCRLF vs LF → пайплайн падает из-за line endings
🔧 Что в итоге сработало
Переменные окружения + дефолты по портам
Healthchecks на уровне Docker и CI
Fallback-логика для
.env в CIОтдельный скрипт проверки живости сервисов
Мониторинг не «потом», а сразу
🧠 Ключевые выводы
Infrastructure as Code ≠ магия — тестируется и ревьюится как код
CI/CD — это быстрый фидбек, а не просто «зелёная галочка»
Порты — ограниченный ресурс, их нужно резервировать заранее
12-Factor App работает и для DevOps, не только для приложений
Наблюдаемость важнее героизма при падении продакшена
🚀 Прод
Zero-downtime deploy
Масштабирование сервисов
Бэкапы перед обновлением
Автоматическая проверка состояния
Это не история про «идеальный стек».
Это история про боль → дисциплину → устойчивую систему.
💬 А как вы решаете конфликты портов?
👉 Ссылка на статью
Библиотека пхпшника
Forwarded from Библиотека задач по PHP | тесты, код, задания
🧠 Монолит или Web API? Проверим на практике
Представьте ситуацию 👇
Вы начинаете новый PHP-проект с нуля.
Есть бизнес-идея, сроки поджимают, команда не бесконечная.
Вопрос не теоретический — архитектурный.
👉 Какой подход вы выберете и почему?
🅰️ Монолит
Быстрее старт
Проще деплой
Меньше инфраструктурного шума
🅱️ Web API + клиент
Чёткие контракты
Готовность к мобильным приложениям
Проще масштабировать команды
🅾️ Модульный монолит (гибрид)
Один репозиторий
Внутренние API/DTO
Возможность без боли выделить API позже
🅿️ Зависит от контекста
Размер команды
Тип продукта
Планируемый рост
Условия (чтобы было честно):
PHP (Laravel / Symfony — не важно)
1–2 месяца на MVP
Возможен рост продукта, но не гарантирован
Продакшн, а не pet-project
💬 Напишите в комментариях:
1️⃣ Что выберете первым шагом
2️⃣ При каком триггере поменяете архитектуру
3️⃣ Какой самый болезненный опыт у вас был: с монолитом или с API
#элементарный_выбор
Библиотека пхпшника
Представьте ситуацию 👇
Вы начинаете новый PHP-проект с нуля.
Есть бизнес-идея, сроки поджимают, команда не бесконечная.
Вопрос не теоретический — архитектурный.
👉 Какой подход вы выберете и почему?
🅰️ Монолит
Быстрее старт
Проще деплой
Меньше инфраструктурного шума
🅱️ Web API + клиент
Чёткие контракты
Готовность к мобильным приложениям
Проще масштабировать команды
🅾️ Модульный монолит (гибрид)
Один репозиторий
Внутренние API/DTO
Возможность без боли выделить API позже
🅿️ Зависит от контекста
Размер команды
Тип продукта
Планируемый рост
Условия (чтобы было честно):
PHP (Laravel / Symfony — не важно)
1–2 месяца на MVP
Возможен рост продукта, но не гарантирован
Продакшн, а не pet-project
💬 Напишите в комментариях:
1️⃣ Что выберете первым шагом
2️⃣ При каком триггере поменяете архитектуру
3️⃣ Какой самый болезненный опыт у вас был: с монолитом или с API
#элементарный_выбор
Библиотека пхпшника