Пых
8.26K subscribers
263 photos
16 videos
6 files
579 links
Блог Валентина Удальцова о разработке на PHP.

Хобот @phpyhobot
https://youtube.com/@phpyh
https://vkvideo.ru/@phpyh
https://t.me/isPHPdying

Статистика: https://t.me/INOTAROBOT?start=st1219340804

Для связи используйте личные сообщения канала.
Download Telegram
fnmatch

Ты когда-нибудь слышал про такую функцию? Я — нет, недавно случайно её встретил в коде Infection.

По сути, это glob для строковых путей.


fnmatch(string $pattern, string $filename, int $flags = 0): bool


Грамматика шаблона:
? совпадает с одним символом,
* совпадает с пустой строкой или несколькими символами,
[] определяет набор или диапазон ASCII символов ([0-9], [0-9a-zABC]),
! используется для отрицания внутри [],
\ экранирует спецсимволы.

Важный флаг — FNM_PATHNAME. Он запрещает ?, *, [] совпадать со слешом.


dump(
fnmatch('*/index.php', 'a/b/c/index.php'), // true
fnmatch('*/index.php', 'a/b/c/index.php', FNM_PATHNAME), // false
fnmatch('*/index.php', 'a/index.php', FNM_PATHNAME), // true
);


📁https://www.php.net/manual/ru/function.fnmatch.php

Этот пост был доступен месяц назад в PHPeople
Please open Telegram to view this post
VIEW IN TELEGRAM
👍26👀106🤔3🤡2🔥1😱1💩1🙏1
С новым годом, дорогие подписчики! ❤️
6168🎉86🍾22🎄16👍6🔥5❤‍🔥3💩2🤡2💊1
Итоги 2025 года

Оглядываясь назад, я понимаю, что это был насыщеный, сложный, во многом спонтанный и экспериментальный год.

Спасибо всем за участие во всём, что я делаю! То ли ещё будет. 🐘

Мероприятия
Пыхап #2 × PremiumBonus
Пыхап #3 × YCLIENTS
Пыхап #4 × Lamoda Tech
Пых.конф’25
Пыхап #5 × LivePHP × Garage Eight

Основные стримы
Кодим с джуном / Евгений Alignant, cпецификации и SQL
PHP True Async: обсуждаем RFC с автором
Pipe-оператор и $$ в PHP с Андреем Клименко
Дженерики в PHP: быть или не быть? с Андреем Клименко
OR: PHP vs GO

Образование
• 5-й поток Хардкорного курса
• Лекция MessageBus
• Лекция Спаси свой репозиторий от save()

Релизы
New без скобок в PHP-CS-Fixer
Thesis Amqp
Thesis Nats

Доклады
Кто отправит outbox? на Пыхапе #4
PHP сегодня на Пых.конф’25
PHP 8.5 не сбавляет темп! на Стачке

Слоники Пых
• Выполнены все обязательства по краудфандинговой кампании, кроме 1 личной встречи.
• Суммарно роздано и продано ~300 слоников, но остались ещё — можно приобрести на Озоне.

PHPeople
Вместе с Данилом Щуцким запустили платформу для PHP-сообщества. На днях мы добавили ещё 5 авторов, скоро анонсируем.

Пишите в комментариях, что вам больше всего запомнилось и понравилось, чего не хватило и чего ждёте от Пыха в 2026.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥58👍20👏65🤡3
Стартовал ежегодный опрос!

С 2020 года лидеры русскоязычного PHP-сообщества проводят опрос. Так мы получаем портрет нашей аудитории и понимаем, на чём фокусироваться в новом году.

В этот раз эстафету от CutCode приняла питерская команда Live PHP, пожелаем ребятам удачи с вёрсткой итогов!

➡️ Пройти опрос

Опрос анонимный, но если оставить свою почту, можно поучаствовать в розыгрыше слоника 💙Пых.

Итоги, как обычно, будут опубликованы на phpcommunity.ru.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍25🔥15🥱311
Media is too big
VIEW IN TELEGRAM
Плюшевые слоники уже есть — что делаем в этом году? Как вариант — 3D-конструтор 5cult.ru. Пишите другие идеи в комментариях.
🔥21👎103👍3🤮2💩1💅1
Переменные среды в Docker Compose

Основной момент, который важно понять, — в docker compose есть два уровня работы с переменными среды.

1. Переменные хоста

Первый уровень — это переменные хоста. Их можно интерполировать в compose.yaml (бывший docker-compose.yml), например:


services:
php:
image: php:${PHP_VERSION}-cli-bookworm


Если запустить docker compose up без PHP_VERSION в среде, получим предупреждение, что такой переменной нет и была использована пустая строка. Дальше, конечно, ошибка: php:-cli-bookworm не является корректной ссылкой на образ.

На уровне синтаксиса тут есть два основных варианта:


# задать значение по умолчанию
image: php:${PHP_VERSION:-8.5}-cli-bookworm

# или превратить предупреждение в ошибку с кастомным текстом
image: php:${PHP_VERSION:?Env variable `PHP_VERSION` is required}-cli-bookworm


Также на этом уровне можно использовать .env файлы. По умолчанию docker compose ищет .env в текущей директории (pwd), затем в директории проекта (где compose.yaml).

Можно явно указать несколько своих .env файлов. Пример с классической схемой .env.local > .env, для отладки используем docker compose config --environment:


echo 'PHP_VERSION=8.4' > .env
echo 'PHP_VERSION=8.5' > .env.local

docker compose --env-file .env \
--env-file .env.local \
config --environment | grep PHP_VERSION

# выведет PHP_VERSION=8.5


Самый высокий приоритет всегда будет у реальных переменных среды:


export PHP_VERSION=8.6

docker compose --env-file .env \
--env-file .env.local \
config --environment | grep PHP_VERSION

# выведет PHP_VERSION=8.6


Про второй уровень, уровень контейнера, расскажу в следующем посте.

📁 Set, use, and manage variables in a Compose file with interpolation
📁 Environment variables precedence in Docker Compose

🐘 Кстати, этот пост я опубликовал в PHPeople ещё в прошлом году, присоединяйся!
Please open Telegram to view this post
VIEW IN TELEGRAM
5👍62🔥159🤡5
Переменные среды в Docker Compose

Разобравшись с переменными уровня хоста, мы готовы обсудить второй уровень.

2. Переменные Docker-сервиса

По умолчанию сервис не получает никакие переменные среды с хоста. Мы можем их прокинуть, используя ключи environment и env_file.

environment можно оформить как объект:


php:
environment:
DB_HOST: postgres
STORAGE_PATH: ${STORAGE_PATH}


или как массив:


php:
environment:
- DB_HOST=postgres
- STORAGE_PATH=${STORAGE_PATH}


Тут возникает интересный момент со значениями по умолчанию. Допустим, в контейнере крутится приложение на Symfony, которое обрабатывает отсуствие переменной среды STORAGE_PATH с использованием процессоров:


$di->parameters()
->set(
'storage.default_path',
'%kernel.project_dir%/var/storage/%kernel.environment%',
);

$di->services()
->set(Storage::class)
->args([
'path' => env('STORAGE_PATH')
->default('storage.default_path')
]);


Если в compose.yaml прописать STORAGE_PATH=${STORAGE_PATH:?/app/var/storage/dev}, это будет не то же самое. Без значения по умолчанию тоже нельзя оставить переменную, иначе Docker выдаст предупреждение и присвоит переменной пустую строку.

Решение, конечно же, есть в документации, но его легко не заметить:

Environment variables can be declared by a single key (no value to equals sign). In this case Compose relies on you to resolve the value. If the value is not resolved, the variable is unset and is removed from the service container environment.



php:
environment:
- STORAGE_PATH: ${STORAGE_PATH}
+ STORAGE_PATH:


или


php:
environment:
- - STORAGE_PATH=${STORAGE_PATH}
+ - STORAGE_PATH


По сути, это самый верный и простой способ прокинуть переменные среды с хоста в контейнер "как есть".

У env_file тоже есть несколько интересных нюансов. Например, начиная с Docker 2.24.0, можно объявлять необязательные файлы:


php:
env_file:
- path: .env # required by default
- path: .env.local
required: false


Сами env файлы по умолчанию парсятся в формате Docker: с интерполяцией ${}, двумя вариантами синтаксиса (: и =) и экранированием. Это можно выключить, задав файлу format: raw.

В будущем обсудим, как укротить всю эту нереальную гибкость и выработать best practice.

📁 Документация по environment
📁 Документация по env_file

🐘 Кстати, этот пост я опубликовал в PHPeople ещё в прошлом году, присоединяйся!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3513🤡7🔥6
🗺️ ClassMap: типизируем опции, конфиги, атрибуты

Новая лекция в Пых Лектории про паттерн ClassMap — расширяемый и типобезопасный способ передачи конфигурации между компонентами.

План лекции:
• берём популярную библиотеку Symfony и находим три проблемы, связанные с передачей нетипизированных опций,
• обсуждаем неоптимальные подходы,
• изучаем паттерн ClassMap,
• применяем его и получаем исчерпывающее решение,
• анализируем плюсы и минусы паттерна ClassMap.

Также лекция затрагивает следующие темы:
• проектирование расширяемых ООП-компонентов,
• иммутабельность,
• дженерики,
• клонирование в PHP 8.5.

Залетай в Хобота, чтобы посмотреть!

50 минут / 1000 рублей
3💊33👍25🔥1354🤮3🤡3👏2🤯2💩2👎1
Пых
🗺️ ClassMap: типизируем опции, конфиги, атрибуты Новая лекция в Пых Лектории про паттерн ClassMap — расширяемый и типобезопасный способ передачи конфигурации между компонентами. План лекции: • берём популярную библиотеку Symfony и находим три проблемы, связанные…
🗺️ ClassMap: типизируем опции, конфиги, атрибуты

Друзья, я осознал, что из тизера и описания многие не поняли, о чём моя новая лекция.

Вместо лишних слов выкладываю первые 11 минут материала, где я подробно демонстрирую проблематику и формулирую задачу.

📹 YouTube | 📹 VK Видео | 💙 Лекция целиком
Please open Telegram to view this post
VIEW IN TELEGRAM
4👍277🔥7💊4🤮3🤡3💩2
Знакомство с новыми авторами PHPeople

У меня в офисе наконец-то появился проводной интернет, и я запускаю сезон стримов на Пыхе!

Для начала сегодня в 19:00 встретимся с новыми авторами PHPeople:

Александр Макаров — всемирно известный лидер команды Yii,
Пётр Мязин — автор Пятиминутки, перешёл с PHP на ИИ,
Павла Бучнев — фартанист и вайб-кодер,
Вадим Дворовенко — знает Laravel как Тейлор, но ещё не лысый,
Edmond Dantes — разрабатывает асинхронный PHP будущего.

Чуть позже объявлю, когда будет первый PHP-линч и Open Source Цех.

📹 YouTube | 📹 VK Видео | 🐘 PHPeople
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥30👍1312😁3🤮1
Сегодня наконец-то PHP-линч #29!

Я открываю новый сезон знаменитой рубрики PHP-линч! Сам по ней невероятно соскучился.

Хотелось бы сразу посмотреть на Yii3, но лучше мы в этот раз разогреемся чем-то поменьше, а, например, в следующую среду весь стрим посвятим Yii.

Залетайте в 19:00 на 📹 YouTube и 📹 VK Видео.

#php_линч
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥31👍97
Думаю новый поток Хардкорного курса прочитать уже про асинхронный PHP. Вместо Symfony возьмём AMPHP и Thesis и научимся работать с неблокирующим I/O. Что скажешь?
Anonymous Poll
57%
Отлично!
17%
Мне интереснее синхронный вариант курса
25%
Всё равно
👍10🔥4🤩21