⚡️ How to: асинхронная обработка в Symfony Messenger
Современные пользователи не хотят ждать, пока ваш сервер «пережёвывает» тяжёлые задачи — будь то генерация отчёта, обработка видео или загрузка большого файла. Решение простое: отправить работу в фон. И здесь на сцену выходит Symfony Messenger.
🚨 Проблема синхронного подхода
Каждый запрос ждёт полного выполнения всех действий.
Отправка письма или генерация PDF может «подвесить» вкладку браузера.
Долгие запросы блокируют сервер и мешают обслуживать других пользователей.
✅ Решение — Messenger
Symfony Messenger реализует паттерн Producer-Consumer:
🔸 Message — простая PHP-DTO с данными (например,
🔸 Handler — сервис с бизнес-логикой обработки.
🔸 Transport — очередь (RabbitMQ, Redis, Doctrine, SQS).
🔸 Worker — отдельный процесс, который слушает очередь и обрабатывает сообщения.
Таким образом, пользователь получает быстрый отклик, а тяжёлая работа уходит в фон.
🎬 Пример: параллельная обработка видео
1. Разбиваем видео на чанки и отправляем каждую часть отдельным сообщением.
2. 10 воркеров параллельно кодируют/обрабатывают куски.
3. Событие VideoChunkProcessed сигнализирует о завершении.
4. После обработки всех чанков запускается CombineVideoChunksMessage, который объединяет куски в готовый файл через FFmpeg.
🚀 Чем это хорошо
🔹 Масштабируется горизонтально: чем больше воркеров, тем быстрее работа.
🔹 Гарантированная устойчивость — сообщения не теряются.
🔹 Архитектура становится модульной и предсказуемой.
👉 Читать статью
🐸 Библиотека пхпшника
Современные пользователи не хотят ждать, пока ваш сервер «пережёвывает» тяжёлые задачи — будь то генерация отчёта, обработка видео или загрузка большого файла. Решение простое: отправить работу в фон. И здесь на сцену выходит Symfony Messenger.
🚨 Проблема синхронного подхода
Каждый запрос ждёт полного выполнения всех действий.
Отправка письма или генерация PDF может «подвесить» вкладку браузера.
Долгие запросы блокируют сервер и мешают обслуживать других пользователей.
✅ Решение — Messenger
Symfony Messenger реализует паттерн Producer-Consumer:
🔸 Message — простая PHP-DTO с данными (например,
ProcessVideoMessage).🔸 Handler — сервис с бизнес-логикой обработки.
🔸 Transport — очередь (RabbitMQ, Redis, Doctrine, SQS).
🔸 Worker — отдельный процесс, который слушает очередь и обрабатывает сообщения.
Таким образом, пользователь получает быстрый отклик, а тяжёлая работа уходит в фон.
🎬 Пример: параллельная обработка видео
1. Разбиваем видео на чанки и отправляем каждую часть отдельным сообщением.
2. 10 воркеров параллельно кодируют/обрабатывают куски.
3. Событие VideoChunkProcessed сигнализирует о завершении.
4. После обработки всех чанков запускается CombineVideoChunksMessage, который объединяет куски в готовый файл через FFmpeg.
🚀 Чем это хорошо
🔹 Масштабируется горизонтально: чем больше воркеров, тем быстрее работа.
🔹 Гарантированная устойчивость — сообщения не теряются.
🔹 Архитектура становится модульной и предсказуемой.
👉 Читать статью
Please open Telegram to view this post
VIEW IN TELEGRAM
😁3👍1🥰1
💥 Весь октябрь -40% на курсы для разработчиков в proglib.academy
Бери знания под свой стек:
Python | алгоритмы | математика для Data Science | архитектура кода.
⚡️ Пока скидка действует, апдейтни свои навыки
Бери знания под свой стек:
Python | алгоритмы | математика для Data Science | архитектура кода.
Пока одни ждут «идеальный момент», другие просто учатся.
А потом берут ваши офферы.
⚡️ Пока скидка действует, апдейтни свои навыки
⌨️ Топ-вакансий по PHP за неделю
Senior PHP разработчик — от 250 000 до 320 000 ₽, Удалёнка (Москва)
PHP dev — от 150 000 до 300 000 ₽, Офис (Казань)
Team Leader / Lead PHP Developer — от 5500 до 6500 $, Удалёнка (Москва)
PHP Developer — от 250 000 ₽, Удалёнка (Москва)
➡️ Еще больше топовых вакансий — в нашем канале PHP Jobs
Senior PHP разработчик — от 250 000 до 320 000 ₽, Удалёнка (Москва)
PHP dev — от 150 000 до 300 000 ₽, Офис (Казань)
Team Leader / Lead PHP Developer — от 5500 до 6500 $, Удалёнка (Москва)
PHP Developer — от 250 000 ₽, Удалёнка (Москва)
➡️ Еще больше топовых вакансий — в нашем канале PHP Jobs
👍1
Bash-скрипт на максималках: как работает менеджер задач для управления 300 скриптами
Статья рассказывает историю о том, как в команда столкнулась с «проклятьем масштаба» при работе с сотнями скриптов для загрузки и обработки данных из десятков открытых источников.
Изначально запуск был построен на cron и bash-скриптах, но со временем процесс стал занимать слишком много времени и стал крайне сложным в поддержке. Готовых решений в 2018 году (например, Airflow) для их специфики не нашлось, поэтому команда спроектировала собственный TaskManager.
По сути, это статья о том, как инженерная проблема управления «зоопарком скриптов» превратилась в задачу по теории графов, и как алгоритмический подход дал решение, которое оказалось масштабируемым и долгоживущим.
🔗 Хабр
Библиотека пхпшника
Статья рассказывает историю о том, как в команда столкнулась с «проклятьем масштаба» при работе с сотнями скриптов для загрузки и обработки данных из десятков открытых источников.
Изначально запуск был построен на cron и bash-скриптах, но со временем процесс стал занимать слишком много времени и стал крайне сложным в поддержке. Готовых решений в 2018 году (например, Airflow) для их специфики не нашлось, поэтому команда спроектировала собственный TaskManager.
По сути, это статья о том, как инженерная проблема управления «зоопарком скриптов» превратилась в задачу по теории графов, и как алгоритмический подход дал решение, которое оказалось масштабируемым и долгоживущим.
🔗 Хабр
Библиотека пхпшника
❤1👍1😢1
Если ты часто переключаешься между ветками в проектах, вот способ сделать это максимально быстро прямо из PhpStorm, без лишних кликов мышкой.
🔍 Как это работает:
1. Нажми
Ctrl+Shift+A (или Cmd+Shift+A на macOS).2. Начни вводить
Git: Checkout и выбери нужную команду.3. Введи название ветки и нажми Enter — мгновенный checkout!
⚡️ Почему это круто:
🔸 Быстро переключаешься между ветками без поиска в списках
🔸 Нет необходимости помнить точные команды Git в терминале
🔸 Удобно при работе с большим количеством веток
Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
Внутреннее устройство PHP-массива (HashTable)
На поверхности
📦 Базовая структура
PHP хранит массив как
Два режима работы:
Packed — когда ключи 0..n-1 без дыр, работает как плотный список.
Mixed — как ассоциативный словарь (строковые и целочисленные ключи). Переключение прозрачно.
🔑 Хеш и распределение
Строковые ключи хешируются внутренней функцией движка; индекс вычисляется по маске таблицы (степень двойки → быстрый
Числовые ключи идут напрямую как индексы (в packed) или как int-ключи (в mixed).
Порядок обхода = порядок вставки.
🌊 Коллизии
Коллизии разрешаются через связные цепочки внутри хеш-слотов (указатели между бакетами). Деревьев, как в Java 8, нет — в худшем случае поиск линейный по цепочке. На практике за счёт маски/resize средняя сложность операций остаётся O(1).
⚡️ Ресайзинг
При росте элементов таблица увеличивается (обычно ×2), элементы перераскладываются в новые слоты по той же маске. Это дорогая операция, но амортизированно остаётся дешёвой.
📊 Производительность (в среднем)
⚖️ Важные нюансы
Порядок важен: массив — упорядоченная структура (вставочный порядок сохраняется).
Типы ключей: только int и string. Числовые строки автоматически приводятся к int (например,
Копирование при записи (COW): присваивание массива создаёт «разделяемую» копию; реальное копирование — при первой модификации. Это экономит память и часто снимает страх «дорого скопировал».
Итерация не fail-fast:
🧮 Когда массив — не то, что нужно
В PHP массив не принимает объекты как ключи. Для кейсов «ключ = объект» есть специальные структуры:
🔍 Частые подводные камни
«Почему
«Почему копия массива не дорога?» — из-за Copy-On-Write: реальный дубликат появится только при изменении.
Библиотека пхпшника
#php_азбука
На поверхности
array — просто «ключ-значение». Под капотом — компактная hash-таблица Zend Engine с режимами для разных сценариев и сохранением порядка вставки. Официально: «array в PHP — упорядоченная карта».📦 Базовая структура
PHP хранит массив как
HashTable (Zend): есть таблица хеш-слотов и массив «бакетов» с элементами. С PHP 7 реализация компактная: меньше аллокаций и память/кэш-локальность лучше по сравнению с PHP 5.Два режима работы:
Packed — когда ключи 0..n-1 без дыр, работает как плотный список.
Mixed — как ассоциативный словарь (строковые и целочисленные ключи). Переключение прозрачно.
🔑 Хеш и распределение
Строковые ключи хешируются внутренней функцией движка; индекс вычисляется по маске таблицы (степень двойки → быстрый
& (n-1)).Числовые ключи идут напрямую как индексы (в packed) или как int-ключи (в mixed).
Порядок обхода = порядок вставки.
🌊 Коллизии
Коллизии разрешаются через связные цепочки внутри хеш-слотов (указатели между бакетами). Деревьев, как в Java 8, нет — в худшем случае поиск линейный по цепочке. На практике за счёт маски/resize средняя сложность операций остаётся O(1).
⚡️ Ресайзинг
При росте элементов таблица увеличивается (обычно ×2), элементы перераскладываются в новые слоты по той же маске. Это дорогая операция, но амортизированно остаётся дешёвой.
📊 Производительность (в среднем)
isset($a[$k]) / чтение / запись — O(1); в крайне «плохих» случаях — O(n) из-за цепочек. Хорошее распределение ключей и разумный размер таблицы держат вас в O(1).⚖️ Важные нюансы
Порядок важен: массив — упорядоченная структура (вставочный порядок сохраняется).
Типы ключей: только int и string. Числовые строки автоматически приводятся к int (например,
«8» → 8; «08» останется строкой). Объекты/массивы как ключи — нельзя.Копирование при записи (COW): присваивание массива создаёт «разделяемую» копию; реальное копирование — при первой модификации. Это экономит память и часто снимает страх «дорого скопировал».
Итерация не fail-fast:
foreach не бросает исключения при изменении массива во время обхода; поведение «слабо-консистентное», ориентируйтесь на читаемость и аккуратность. (Специального fail-fast механизма как в JDK нет; официальная дока описывает лишь общие правила итерации массива.) 🧮 Когда массив — не то, что нужно
В PHP массив не принимает объекты как ключи. Для кейсов «ключ = объект» есть специальные структуры:
SplObjectStorage — map/set для объектов-ключей. Удобно для учёта уникальных объектов, привязки метаданных к объекту. WeakMap (PHP 8+) — как map «объект → значение», но не удерживает объект от GC: когда объект больше нигде не живёт, пара удаляется из карты. Идеально для кэшей, завязанных на жизненный цикл объекта. 🔍 Частые подводные камни
«Почему
«123» стал ключом 123?» — потому что numeric string → int по правилам массива. Если хотите именно строковый ключ, сделайте его явно невалидной «десятичной» формой (например, «+123» или «00123»), или храните в другой структуре.«Почему копия массива не дорога?» — из-за Copy-On-Write: реальный дубликат появится только при изменении.
Библиотека пхпшника
#php_азбука
👍11❤1
12 ключевых команд, которые составляют основу рабочего процесса Git.
Please open Telegram to view this post
VIEW IN TELEGRAM
😁4👍1
Как вам функция?
По словам автора, это лучшее что он написал за 20 лет карьеры
💬 А у вас в запасе есть такие динозавры? Делитесь в коментах👇
Библиотека пхпшника
#байтовый_юмор
По словам автора, это лучшее что он написал за 20 лет карьеры
💬 А у вас в запасе есть такие динозавры? Делитесь в коментах👇
Библиотека пхпшника
#байтовый_юмор
👍17🌚3🤔2
Forwarded from Книги для программистов
📚 Release It!: Design and Deploy Production-Ready Software, 2nd Edition (2018)
Эта книга — как дневник боли разработчиков, только без слёз (почти). Автор рассказывает, как не допустить, чтобы твой код превратился в ночной кошмар DevOps-а.
В обновлённом издании рассказывается о создании современных систем — более крупных, сложных и в значительной степени виртуализированных.
Что внутри:
⚡️ Антипаттерны стабильности и как их обходить
☁️ Про DevOps, микросервисы и облака без боли
💥 Хаос-инжиниринг (да, ломать специально, чтобы не рухнуло потом)
🔄 Нулевой даунтайм и непрерывная доставка
🔗 Скачать
🤞 Поддержать канал бустом
🐸 Книги для программистов
Эта книга — как дневник боли разработчиков, только без слёз (почти). Автор рассказывает, как не допустить, чтобы твой код превратился в ночной кошмар DevOps-а.
В обновлённом издании рассказывается о создании современных систем — более крупных, сложных и в значительной степени виртуализированных.
Что внутри:
⚡️ Антипаттерны стабильности и как их обходить
☁️ Про DevOps, микросервисы и облака без боли
💥 Хаос-инжиниринг (да, ломать специально, чтобы не рухнуло потом)
🔄 Нулевой даунтайм и непрерывная доставка
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
💻 Подборка новостей по PHP за неделю:
🔹 Laravel 12.32 — добавлен метод
🔹 Craft CMS переходит на Laravel — на конференции Dot All объявлено, что Craft CMS 6 будет работать на Laravel, что обещает мощную экосистему и ускорение разработки.
🔹 Новая команда setup в Laravel — теперь установка проекта стала проще: одной командой Composer можно выполнить все основные шаги по настройке окружения.
🔹 Symfony 29 сентября — 5 октября 2025 — в Symfony 7.4 устарели XML-конфигурации для сервисов и маршрутов, добавлены PHP-атрибуты для консольных аргументов и улучшен HTTP-клиент с кэшированием.
Библиотека пхпшника
#свежак
🔹 Laravel 12.32 — добавлен метод
Http::batch() для пакетных HTTP-запросов, метод after() для тонкой настройки rate limiting по ответам, а также поддержка callback’ов при сбое batch-задач.🔹 Craft CMS переходит на Laravel — на конференции Dot All объявлено, что Craft CMS 6 будет работать на Laravel, что обещает мощную экосистему и ускорение разработки.
🔹 Новая команда setup в Laravel — теперь установка проекта стала проще: одной командой Composer можно выполнить все основные шаги по настройке окружения.
🔹 Symfony 29 сентября — 5 октября 2025 — в Symfony 7.4 устарели XML-конфигурации для сервисов и маршрутов, добавлены PHP-атрибуты для консольных аргументов и улучшен HTTP-клиент с кэшированием.
Библиотека пхпшника
#свежак
💡Совет по Laravel: хук в события аутентификации
Знаешь ли ты, что в Laravel модуль аутентификации уже «на борту» поставляется с целой кучей событий, на которые ты можешь «подписаться»? Независимо от того, пытается пользователь войти или терпит неудачу, ты можешь отлавливать эти моменты и делать с ними что угодно 🚀
Библиотека пхпшника
#vardump
Знаешь ли ты, что в Laravel модуль аутентификации уже «на борту» поставляется с целой кучей событий, на которые ты можешь «подписаться»? Независимо от того, пытается пользователь войти или терпит неудачу, ты можешь отлавливать эти моменты и делать с ними что угодно 🚀
Библиотека пхпшника
#vardump
👍14❤1
⚡ Создание реактивных систем на PHP: когда асинхронность и потоки имеют смысл
Когда-то «асинхронный PHP» звучало как оксюморон.
Но времена «запрос-ответ и умер» уходят — современным приложениям нужно реагировать в реальном времени: стримить данные, обновлять дашборды, обрабатывать события.
🧩 Раньше: PHP жил в блокирующем мире — каждая операция ждала предыдущую. Просто, но медленно.
⚙️ Теперь: движки вроде ReactPHP и Swoole позволяют запускать корутины, слушать события и держать процесс живым.
📈 Что это даёт:
— Реактивные API и чаты без Node.js
— Потоковую обработку логов и телеметрии
— Масштабирование без взрывного роста потоков
— Меньше ожиданий, больше отклика
💡 Но важно помнить:
Async не делает код быстрее — он делает ожидание дешевле.
Он не для CRUD-панелей, а для систем, где данные текут потоком.
🕵️♂ А ещё — вам придётся дружить с логированием, контролем памяти и дисциплиной.
Асинхронщина не про хаос, а про осознанную реактивность.
🔗 Medium
Библиотека пхпшника
Когда-то «асинхронный PHP» звучало как оксюморон.
Но времена «запрос-ответ и умер» уходят — современным приложениям нужно реагировать в реальном времени: стримить данные, обновлять дашборды, обрабатывать события.
🧩 Раньше: PHP жил в блокирующем мире — каждая операция ждала предыдущую. Просто, но медленно.
⚙️ Теперь: движки вроде ReactPHP и Swoole позволяют запускать корутины, слушать события и держать процесс живым.
📈 Что это даёт:
— Реактивные API и чаты без Node.js
— Потоковую обработку логов и телеметрии
— Масштабирование без взрывного роста потоков
— Меньше ожиданий, больше отклика
💡 Но важно помнить:
Async не делает код быстрее — он делает ожидание дешевле.
Он не для CRUD-панелей, а для систем, где данные текут потоком.
🕵️♂ А ещё — вам придётся дружить с логированием, контролем памяти и дисциплиной.
Асинхронщина не про хаос, а про осознанную реактивность.
🔗 Medium
Библиотека пхпшника
❤1
This media is not supported in your browser
VIEW IN TELEGRAM
В proglib.academy — Глобальная распродажа знаний ‼️
💥 Весь октябрь –40% на те курсы, которые выбирают чаще всего.
👉 Успей забрать свой курс на proglib.academy
💥 Весь октябрь –40% на те курсы, которые выбирают чаще всего.
Курсы с практикой, без воды и пафоса.
Просто берёшь и делаешь апгрейд.
👉 Успей забрать свой курс на proglib.academy
🥱6🙏1🌚1
Forwarded from Библиотека задач по PHP | тесты, код, задания
Что будет выведено в результате работы кода?
Forwarded from Библиотека задач по PHP | тесты, код, задания
Что будет выведено в результате работы кода?
Anonymous Quiz
41%
Hello World
7%
Hello
10%
WorldHello
18%
WorldHello 1
23%
Ошибка
😢4🥱1
Введение в MongoDB и настройка Laravel-MongoDB
В статье показано, как связать Laravel с MongoDB и построить полноценный блог с полиморфными моделями и поиском — без боли SQL-таблиц и JOIN-ов.
⚙️ Что внутри
Разбор основ MongoDB и её преимуществ над SQL (динамическая схема, отсутствие
Настройка Laravel-проекта с подключением MongoDB Atlas.
Создание полиморфных моделей —
Реализация CRUD-операций, поиска и категорий контента.
Использование MongoDB-фишек — массивов, вложенных документов, агрегаций и индексов.
💡 Главное преимущество
MongoDB позволяет хранить разные типы контента в одной коллекции без миграций и строгих схем.
Добавляете поле в модель — и оно уже работает.
📈 В итоге: Laravel остаётся удобным как Eloquent, но становится гибким, как NoSQL.
А блог из туториала — готовая база для любых CMS или knowledge-систем.
👉 Читать статью
Библиотека пхпшника
В статье показано, как связать Laravel с MongoDB и построить полноценный блог с полиморфными моделями и поиском — без боли SQL-таблиц и JOIN-ов.
⚙️ Что внутри
Разбор основ MongoDB и её преимуществ над SQL (динамическая схема, отсутствие
NULL, масштабирование из коробки).Настройка Laravel-проекта с подключением MongoDB Atlas.
Создание полиморфных моделей —
Post, Article, Tutorial — которые живут в одной коллекции contents, но имеют разные поля.Реализация CRUD-операций, поиска и категорий контента.
Использование MongoDB-фишек — массивов, вложенных документов, агрегаций и индексов.
💡 Главное преимущество
MongoDB позволяет хранить разные типы контента в одной коллекции без миграций и строгих схем.
Добавляете поле в модель — и оно уже работает.
📈 В итоге: Laravel остаётся удобным как Eloquent, но становится гибким, как NoSQL.
А блог из туториала — готовая база для любых CMS или knowledge-систем.
👉 Читать статью
Библиотека пхпшника
🎉 Filament v4.1 — апдейт, который приятно почувствовать руками
Команда Filament выкатала свежий релиз v4.1 — и это не просто мелкий патч.
🔧 156 багфиксов и 💡 39 новых фич сделали фреймворк ещё гибче и приятнее для разработки.
💥 Что нового
🧭 Новый макет панели без Topbar
Теперь можно полностью убрать верхнюю панель (
Отлично подойдёт для дашбордов и кастомных админок.
🧱 Rich Editor стал взрослее
🖋️ Grid Tool — вставляйте адаптивные сетки (до 12 колонок) прямо в контент.
🎨 Text Color Tool — добавляйте цвет текста из палитры Tailwind или своих кастомных оттенков, с автоматической адаптацией под тёмную тему.
📋 Компактные таблицы и повторители
А
🚫 Новый компонент Empty State
Добавляйте дружелюбные пустые состояния с иконкой, описанием и кнопкой действия:
Больше никаких унылых «ничего не найдено».
🧩 Экосистема плагинов растёт
🔗 Уже 224 плагина для Filament v4!
Из свежих фаворитов:
Passkeys — вход без пароля
Prizm Theme — новый стильный UI
Header Select — улучшенные селекты в таблицах
🚀 Обновиться можно одной командой:
Библиотека пхпшника
#свежак
Команда Filament выкатала свежий релиз v4.1 — и это не просто мелкий патч.
🔧 156 багфиксов и 💡 39 новых фич сделали фреймворк ещё гибче и приятнее для разработки.
💥 Что нового
🧭 Новый макет панели без Topbar
Теперь можно полностью убрать верхнюю панель (
->topbar(false)), перенести поиск и меню пользователя в боковую часть — и получить максимум вертикального пространства.Отлично подойдёт для дашбордов и кастомных админок.
🧱 Rich Editor стал взрослее
🖋️ Grid Tool — вставляйте адаптивные сетки (до 12 колонок) прямо в контент.
🎨 Text Color Tool — добавляйте цвет текста из палитры Tailwind или своих кастомных оттенков, с автоматической адаптацией под тёмную тему.
📋 Компактные таблицы и повторители
Repeater теперь поддерживает компактный режим (->compact()), который делает поля аккуратными внутри таблицы.А
RepeatableEntry получил табличный вывод — можно красиво отображать данные, иконки и изображения в ячейках.🚫 Новый компонент Empty State
Добавляйте дружелюбные пустые состояния с иконкой, описанием и кнопкой действия:
EmptyState::make('No users yet')->description('Get started by creating a new user.')Больше никаких унылых «ничего не найдено».
🧩 Экосистема плагинов растёт
🔗 Уже 224 плагина для Filament v4!
Из свежих фаворитов:
Passkeys — вход без пароля
Prizm Theme — новый стильный UI
Header Select — улучшенные селекты в таблицах
🚀 Обновиться можно одной командой:
composer update filament/*Библиотека пхпшника
#свежак
❤2🔥2