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

Хобот @phpyhobot
https://youtube.com/@phpyh
https://vkvideo.ru/@phpyh
https://news.1rj.ru/str/isPHPdying

Статистика: https://news.1rj.ru/str/INOTAROBOT?start=st1219340804

Для связи используйте личные сообщения канала.
Download Telegram
Garage Eight × LivePHP × Пыхап в Санкт-Петербурге

Мы в эфире!

💣 NULL. Выбросить нельзя использовать
После этого доклада от Владимира Романичева разрешается бить морды.

🧬 RabbitMQ: как кворумные очереди окончательно победили зеркалированные
Виктор Михайлов расскажет, как использовать надёжные реплицируемые очереди в кролике.

🧠 Архитектура ИИ-сервиса для распознавания документов
Михаил Мироненко покажет путь от MVP до продакшена.

Залетай в YouTube и VK Видео!
Please open Telegram to view this post
VIEW IN TELEGRAM
2🔥19👍92
-export-ignore в .gitattributes

Оказывается, в .gitattributes можно описывать правила от обратного, то есть сначала применять ко всему, а потом точечно отменять при помощи знака -.

Особенно удобно для export-ignore: сначала игнорим всё, а потом возвращаем только важные для распространения пакета файлы:


* export-ignore
/src/ -export-ignore
/src/** -export-ignore
/composer.json -export-ignore
/README.md -export-ignore
/CHANGELOG.md -export-ignore
/LICENSE -export-ignore


📁Параграф в документации gitattributes
📁PR в Composer, который добавил поддержку -export-ignore аж в 2021

Исправлено 10 декабря: добавил правило /src/** -export-ignore, см. пост.
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍396🔥5
Пых
-export-ignore в .gitattributes Оказывается, в .gitattributes можно описывать правила от обратного, то есть сначала применять ко всему, а потом точечно отменять при помощи знака -. Особенно удобно для export-ignore: сначала игнорим всё, а потом возвращаем…
Выяснилось, что /src/ -export-ignore разыгноривает только саму директорию src. Для файлов надо ещё добавить правило /src/** -export-ignore.

В документации к gitattributes это есть (RTFM):

The rules by which the pattern matches paths are the same as in .gitignore files, with a few exceptions:
- negative patterns are forbidden
- patterns that match a directory do not recursively match paths inside that directory (so using the trailing-slash path/ syntax is pointless in an attributes file; use path/** instead)


Итоговый рабочий вариант (проверено при помощи git archive с директориями и файлами разной вложенности):


* export-ignore
/src/ -export-ignore
+/src/** -export-ignore
/composer.json -export-ignore
/README.md -export-ignore
/CHANGELOG.md -export-ignore
/LICENSE -export-ignore


Закинул исправляющий PR в yii-soft/package-template.
👍279🔥1
Hello, my name is Human

Все нерекламные посты на канале Пых написаны лично мной. Так было, так есть и так всегда будет.

Недавно на одном созвоне прозвучало обобщение в духе "да сейчас все через ИИ генерят посты". Хуй там плавал — я пишу сам, иначе для меня в этом не было бы никакого смысла.

Конечно, я могу перепроверить какой-то факт при помощи чатика, но в этом случае я его использую исключительно как альтернативу поиску. Я никогда не прошу сформулировать мысль или поправить стилистику. Мне важно, что идея, которую я придумал, облечена в форму, которую я сам создал. Для меня в этом состоит суть авторства и самовыражения.

Как же тупо, что теперь об этом надо как-то специально уведомлять. В идеале это должно подразумеваться. Но вот такие сегодня всратые реалии...

Кстати, длинные тире я ставлю примерно с тех пор, как прошёл пунктуацию в школе. Например, второй пост на канале от 6 апреля 2019 содержит длинное тире. На маке это делается одним сочетанием: Shift + ⌥ + -.
52👍6622🔥16🥱4🍌2👏1
🐘 PHPeople

Данил с CutCode и я запускаем новый проект для PHP-сообщества!

🧩 Проблема

С одной стороны, в сообществе есть куча крутых ребят, готовых делиться опытом, обозревать тулинг и контрибьютить в экосистему PHP. Но без материального поощрения на это трудно выделить время и силы. Условный Boosty обходится дорого, а страницу там ещё как-то надо продвигать.

С другой стороны, есть вы — аудитория, которой в 2024 не хватило онлайн-контента. И вы наверняка готовы поддержать авторов, заплатив разумные деньги за хорошие материалы, которые можно прочитать и обсудить в Телеге, "не отходя от кассы".

💡 Решение

Мы разработали платформу по модели подписки на базе Telegram — PHPeople.

Подписка двухуровневая:
1. обязательная на общий чат — "лобное место" для всех участников, тут периодически публикуется часть контента авторов и можно обсуждать вопросы широким кругом;
2. опциональная на любые авторские чаты — собственное пространство каждого автора и его подписчиков.

Стоимость каждой подписки — 150₽. То есть, например, чтобы подписаться только на Дмитрия Дерепко, вам нужно внести 300₽ (общий чат + авторский). На Кирилла Несмеянова и Алексея Гагарина — 450₽ (общий чат + 2 авторских).

👨‍🏫 Авторы

Пока их пятеро:

Кирилл Несмеянов уже набросал всякой хардкорной дичи,
Алексей Гагарин начал писать про разработку Testo — убийцу PHPUnit,
Олег Мифле придумал отрефаторить старый ball of mud на Symfony и микросервисы,
Дима Дерепко расскажет про свои плагины и разработку Language Server.

Я тоже автор. На PHPeople буду проводить закрытые стримы и публиковать посты для Пыха на пару недель раньше. В моём чате уже есть несколько постов про типизацию и нюансы Docker Compose и запись стрима про скаффолдер репозиториев Thesis и Typhoon.

🚀 Давайте пробовать!

Мы провели закрытое бета-тестирование и теперь готовы пригласить всех! Залетайте в @phpeople_bot, там можно подробнее со всем ознакомиться и присоединиться.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥46👍29🤡107👎5👀3👏2🤮1
Forwarded from Erick's Streams
🖥 Библиотека для сбора метрик Prometheus для PHP.

В пояснительной записке к дипломной работе в колледже, а после и в университете, всегда первыми шли «Анализ существующих аналогов» и «Обоснование выбора языка и сред разработки». В учебное время это были смешные пункты, мол, конечно, есть аналоги лучше моего куска, да и обоснование простое — это надо для учёбы.

Но видит бог, на работе я до последнего сопротивлялся тому, чтобы браться писать свой велосипед. Самая популярная 🖥 библиотека имела ряд фатальных недостатков, форки не спасали, а альтернативы находились ещё дальше от того, что было нужно для нашей инфраструктуры. Таким образом вывод был однозначен: нужно писать своё 💀

За основу я взял 🖥 форк вышеупомянутой библиотеки, т.к. её интерфейс и архитектура были наиболее удачными, а в форке уже была проделана часть необходимой работы. Чем больше я рефакторил, тем больше я начинал понимать, почему в крупных компаниях есть практика аудита зависимостей 🙃

Вот вам несколько примеров (24 миллиона установок, кстати):
KEYS для сбора метрик.
base64() поверх json_encode().
EVAL для записи метрик.
SISMEMBER перед SADD.
SCAN для очистки хранилища.
"Тесты" 😂

// Такс, какие они плохие я написал, теперь нужно рассказать о том, какой я молодец

В моём велосипеде:
⭐️ Реализация на двух хешах Redis.
⭐️ Абстрагированная реализация клиента Redis.
⭐️ Сборка метрик в 2 запроса к Redis.
⭐️ Строгая типизация для PHPStan и Psalm.
⭐️ Реальные тесты (пусть их пока и мало).
⭐️ Гораздо более читаемый код (субъективно).

Библиотека успешно внедрена на моём рабочем проекте и в перспективе заменит statsd на Аккаунтах Ely.by.

Так что прошу любить и жаловать:
🖥 GitHub
🖥 Packagist
Please open Telegram to view this post
VIEW IN TELEGRAM
👍31🔥159
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
С новым годом, дорогие подписчики! ❤️
6167🎉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👍60🔥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
👍3512🤡7🔥6
🗺️ ClassMap: типизируем опции, конфиги, атрибуты

Новая платная лекция в Пых Лектории!

В ней мы изучим расширяемый и типобезопасный способ передачи конфигурации между компонентами.

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

В конце проанализируем плюсы и минусы паттерна ClassMap для понимания области его применения.

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

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

50 минут / 1000 рублей
💊25👍21🔥1043👏2🤯2🤮2👎1💩1🤡1