💡Совет по Laravel: методы
При работе с коллекциями Laravel может возникнуть необходимость преобразовать многомерную коллекцию в одноуровневую или наоборот. К счастью, для этого существуют два метода:
Библиотека пхпшника
#vardump
dot и undotПри работе с коллекциями Laravel может возникнуть необходимость преобразовать многомерную коллекцию в одноуровневую или наоборот. К счастью, для этого существуют два метода:
dot() и undot() 🚀.Библиотека пхпшника
#vardump
👍10
🧵 PHP и многопоточность: куда всё реально движется (TrueAsync)
Статья — не про «давайте добавим async». Она отвечает на более жёсткий вопрос: способен ли PHP вообще эволюционировать к настоящему параллелизму — и какой ценой.
Коротко и без иллюзий 👇
❓ Зачем эта статья
RFC TrueAsync 1.7 упирается в будущее PHP Core. Асинхронность нельзя проектировать в вакууме — нужно понимать:
где у PHP фундаментальные ограничения,
можно ли выйти за рамки корутин,
возможна ли реальная многопоточность без слома экосистемы.
🧪 Эксперимент, который всё прояснил
Попытка обрабатывать CPU-тяжёлую телеметрию через корутины (Swoole):
I/O — отлично
CPU (сжатие, сериализация) — просадка throughput ×2
Вывод жёсткий, но честный:
Решение с выносом вычислений в отдельные процессы оказалось быстрее, несмотря на IPC.
🧠 Базовая модель: Single-threaded + offload
Рабочая архитектура, уже доказавшая эффективность:
Event Loop (1 поток)
I/O, сеть, БД, ожидание
Workers (несколько потоков / процессов)
сжатие, криптография, парсинг, ML
Так работают:
🔸Node.js (Worker Threads)
🔸Python (asyncio + executors)
🔸 PHP (Swoole Request Workers + Task Workers)
✅ Плюсы модели
🔹 тысячи I/O-операций без mutex’ов
🔹 простота reasoning’а (нет гонок)
🔹 минимум требований к компилятору
🔹 контроль над нагрузкой
❌ Минусы
🔻 ручное разделение задач
🔻 легко ошибиться и положить event loop
🔻 плохо подходит для вычислительных систем
🧱 Почему PHP не готов к потокам «из коробки»
Главная проблема — память и GC:
🔸глобальный
🔸refcount + stop-the-world GC
🔸память одного VM нельзя освобождать из другого потока
🔸ZTS ≠ настоящая многопоточность
PHP — строго single-VM модель.
🧠 Ключевая идея: не делить память, а передавать владение
Вместо shared mutable state:
🔸move-семантика объектов
🔸если
🔸иначе → deep copy с сохранением идентичности
Это:
🔸безопасно
🔸без сериализации
🔸прозрачно для разработчика
🧵 Что реально нужно в core
🔸многопоточный memory manager
🔸адаптация GC под параллельный режим
🔸поддержка shared immutable объектов (
🔸исследование region-based memory
Это не «хотелки», а необходимые условия.
🧩 Корутины + потоки вместе
Поток =
🔸корутина не блокируется
🔸CPU-задача уходит в thread pool
🔸event loop остаётся отзывчивым
Код выглядит последовательно, но работает параллельно.
🎭 Самая сильная абстракция — Actors
Actors дают:
🔸изолированное состояние
🔸последовательную обработку сообщений
🔸отсутствие mutex’ов
естественное OOP-мышление
Каждый actor:
🔸может жить в своём потоке
🔸имеет собственный регион памяти
🔸безопасно масштабируется
Это реальный путь к безопасной многопоточности в PHP.
🔗 Medium
Библиотека пхпшника
Статья — не про «давайте добавим async». Она отвечает на более жёсткий вопрос: способен ли PHP вообще эволюционировать к настоящему параллелизму — и какой ценой.
Коротко и без иллюзий 👇
❓ Зачем эта статья
RFC TrueAsync 1.7 упирается в будущее PHP Core. Асинхронность нельзя проектировать в вакууме — нужно понимать:
где у PHP фундаментальные ограничения,
можно ли выйти за рамки корутин,
возможна ли реальная многопоточность без слома экосистемы.
🧪 Эксперимент, который всё прояснил
Попытка обрабатывать CPU-тяжёлую телеметрию через корутины (Swoole):
I/O — отлично
CPU (сжатие, сериализация) — просадка throughput ×2
Вывод жёсткий, но честный:
Корутины не решают CPU-bound задачи.
Решение с выносом вычислений в отдельные процессы оказалось быстрее, несмотря на IPC.
🧠 Базовая модель: Single-threaded + offload
Рабочая архитектура, уже доказавшая эффективность:
Event Loop (1 поток)
I/O, сеть, БД, ожидание
Workers (несколько потоков / процессов)
сжатие, криптография, парсинг, ML
Так работают:
🔸Node.js (Worker Threads)
🔸Python (asyncio + executors)
🔸 PHP (Swoole Request Workers + Task Workers)
✅ Плюсы модели
🔹 тысячи I/O-операций без mutex’ов
🔹 простота reasoning’а (нет гонок)
🔹 минимум требований к компилятору
🔹 контроль над нагрузкой
❌ Минусы
🔻 ручное разделение задач
🔻 легко ошибиться и положить event loop
🔻 плохо подходит для вычислительных систем
🧱 Почему PHP не готов к потокам «из коробки»
Главная проблема — память и GC:
🔸глобальный
object_store🔸refcount + stop-the-world GC
🔸память одного VM нельзя освобождать из другого потока
🔸ZTS ≠ настоящая многопоточность
PHP — строго single-VM модель.
🧠 Ключевая идея: не делить память, а передавать владение
Вместо shared mutable state:
🔸move-семантика объектов
🔸если
refcount = 1 → перенос без копии🔸иначе → deep copy с сохранением идентичности
Это:
🔸безопасно
🔸без сериализации
🔸прозрачно для разработчика
🧵 Что реально нужно в core
🔸многопоточный memory manager
🔸адаптация GC под параллельный режим
🔸поддержка shared immutable объектов (
GC_SHARE)🔸исследование region-based memory
Это не «хотелки», а необходимые условия.
🧩 Корутины + потоки вместе
Поток =
Awaitable.🔸корутина не блокируется
🔸CPU-задача уходит в thread pool
🔸event loop остаётся отзывчивым
Код выглядит последовательно, но работает параллельно.
🎭 Самая сильная абстракция — Actors
Actors дают:
🔸изолированное состояние
🔸последовательную обработку сообщений
🔸отсутствие mutex’ов
естественное OOP-мышление
Каждый actor:
🔸может жить в своём потоке
🔸имеет собственный регион памяти
🔸безопасно масштабируется
Это реальный путь к безопасной многопоточности в PHP.
🔗 Medium
Библиотека пхпшника
❤5🔥3🌚1
This media is not supported in your browser
VIEW IN TELEGRAM
🐘 PHP 8.5 выходит, а вы всё ещё не разобрались, какие фичи реально поменяют код, а какие останутся в релиз-нотах?
📖 На открытом уроке мы разберём, что именно вошло в релиз, какие изменения затронут ваш повседневный код и инфраструктуру, а какие можно отложить. Посмотрим на ключевые нововведения, изменения в языке и поведении, обсудим, как аккуратно внедрять их в проект.
❗️ Урок будет полезен практикующим PHP-разработчикам, которые хотят писать современный код, готовиться к обновлению продакшен-окружения и понимать, куда развивается стек. Вы получите структурированную выжимку вместо бесконечного чтения разрозненных статей.
▶️ Встречаемся 14 января в 20:00 МСК в преддверие старта курса «PHP Developer. Professional»: https://clc.to/0kdArw
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Please open Telegram to view this post
VIEW IN TELEGRAM
😁1
Forwarded from Библиотека задач по PHP | тесты, код, задания
👍7❤1
⚖️ 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🥱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 и кастомные форматтеры.👉 Подробный разбор и примеры — в статье.
Библиотека пхпшника