Пых
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
Напоминаю, что завтра в 18:30 мы встречаемся на совместном митапе Garage Eight × LivePHP × Пыхап!

🏢 Ждём офлайн в Санкт-Петербурге в офисе Garage Eight по адресу Новгородская, 17, Бизнес-центр М22. Вход с Кирочной улицы, мы будем вас встречать внутри. Паспорт не нужен, только регистрация. Передать место другу можно через @airkatie.

🖥 Ждём онлайн в YouTube и VK Видео. Кстати, в онлайне тоже можно будет выиграть приз за лучший вопрос!

🙅🏻‍♀️ Если передумал(-а) или по какой-либо причине не сможешь прийти, пожалуйста, сообщи об этом @airkatie.

До встречи на митапе!
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
15👍13🔥6
This media is not supported in your browser
VIEW IN TELEGRAM
👍24🔥1311
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
С новым годом, дорогие подписчики! ❤️
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