PHP Fart Time
1.8K subscribers
92 photos
5 videos
2 files
186 links
Привет, фартаны!

Дурачимся, пилим OpenSource и рассказываем про пердовые технологии в php.

Авторы контента: @roxblnfk и @butschster
Download Telegram
Павлика поздравляю с днём рождения!
🔥56308
Ben Ramsey предлагает обновить лицензию PHP.
Вместо старых кастомок перевести Zend на BSD-3, а PHP на BSD-4.

Думаю, Ben Ramsey многим из нас известен благодаря своему пакету ramsey/uuid, который стал де-факто стандартом для UUID, хотя, вероятно, симфонисты о нём уже позабыли и используют symfony/uid.

Но знаете ли вы, что Ben пошёл дальше в этом направлении?
- запилил identifier/identifier — набор интерфейсов для идентификаторов.
- зарегистрировал identifier/identifier-implementationвиртуальный пакет идентификаторов.
- и запилил под него свою реализацию ramsey/identifier. Кроме UUID, пакет предоставляет айдишники ULID и SnowFlake.

Сейчас пакеты не имеют стабильного тега, но код ramsey/identifier, как заверяет Ben, довольно стабилен. Всё, что ему осталось сделать до релиза: дописать доку и гайды.

Что будет с ramsey/uuid?
Ultimately, what I’d like to do is get ramsey/uuid to start using the identifier/identifier interface and then maybe use ramsey/identifier under the hood, making it easier for folks to start transitioning away from ramsey/uuid.


В наших проектах ramsey/uuid активно используется и списывать со счетов его рано. Однако, в Cycle ORM уже начата работа над новым пакетом cycle/entity-behavior-identifier на смену старому.
Спасибо Adam Dyson (@puzzledpolymath) и остальному инициативному сообществу!
🔥22137💊1
В этой статье вы узнаете, как я всрал 4 дня на проект, который мог бы запилить за 4 часа, если бы сразу выбрал другой стек.
И как прошло моё знакомство с BosonPHP и Symfony AI.

👩‍💻 roxblnfk/happy-wife-happy-life
Не забывайте про звёздочки: они помогают бесполезным проектам улетать в топ :)

#Article
Please open Telegram to view this post
VIEW IN TELEGRAM
😁29🔥16
Пакетные новости #PackageNews

dload
(тулза доставки бинарей) теперь умеет собирать RoadRunner с произвольным набором плагинов.
Достаточно прописать список нужных плагинов в конфиге и запустить dload build.
<dload>
<actions>
<velox velox-version="2025.1.1"
roadrunner-ref="v2025.1.1"
>
<plugin name="temporal" />
<plugin name="kv" />
</velox>
</actions>
</dload>

DLoad использует сервис build.roadrunner.dev для компоновки нужных версий плагинов и установленный в систему Golang для сборки. Если у вас есть свои плагины RoadRunner и вы хотите их распространять — расскажите о них, а мы добавим.
👩‍💻 Github

Павел рассказал про Data Grid (если телега падает или не перекидывает к нужному сообщению, значит вы просто не добавились в нашу группу), а в ближайшее время планирует ещё и стрим провести на эту тему
Пакет spiral/data-grid много лет как готов и широко используется в наших админках, но почему-то мало кто вообще поднимает тему гридов.
👩‍💻 Github

Новости по Happy Wife – Happy Life: я таки всрал по всем номинациям (не взял ни одной).
👩‍💻 GitHub
С этого я совсем чуть-чуть подрасстроился 🍷, в связи с чем вопрос: кто нанимает в R&D за $6k+? :)


Вчера на канале Пых на стриме по Thesis https://t.iss.one/phpyh/801 Вадим рассказал про новый пакет thesis/nats.
Это асинхронный драйвер на NATS, который популярен у гошников.
👩‍💻 GitHub

Я лишний раз напомню, что NATS поддерживается RoadRunner'ом уже 4 года как (JetStream API).
И, кроме запуска PHP в режиме воркера и предоставления единого интерфейса запуска PHP-джоб, RR берёт на себя ещё одну важную функцию: IO. Причём RR доставит данные даже тогда, когда PHP-воркер уже помер или взял в работу другую задачу.
Любая имплементация низкоуровневого IO-взаимодействия на самом PHP будет проигрывать компилируемым языкам как минимум из-за ZVAL. Я и сам порой пишу штуки на файберах, однако я не верю в то, что наше пых-сообщество уже готово к этому вызову.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1310🤔1
Пакетные новости #PackageNews

👩‍💻 arthurdick/term-to-svg — тулза для конвертации CLI-сессии в анимированный SVG файл. Может быть полезна разработчикам CLI-пакетов.
Автор — Arthur Dick.

👩‍💻 terremoth/php-async — запуск сериализованных кложур в отдельных процессах. Здесь интересно то, что кложура передаётся в фоновый скрипт с помощью Shared Memoroy.

👩‍💻 Infection 0.31.0 теперь по умолчанию не мутирует код, не покрытый тестами. Чуть ранее были и другие оптимизации производительности Infection.
А вы мутируете свой код?


👩‍💻 PHP-ORT — более осознанный подход к решению проблем PHP в эру AI, чем Symfony AI Platform.
Пока последние говнокодят коннекторы отвратительного качества к апишкам популярных AI-платформ, @krakjoe зашёл с другой стороны и запилил высокопроизводительную библиотеку для тензорных вычислений с SIMD-оптимизациями (AVX2/SSE) и многопоточностью. Опционально поддерживает ONNX Runtime для запуска готовых моделей.
Python модели тренирует, а PHP получает нативные возможности для их использования, оставаясь самым популярным языком веба.
Фундаментальное решение вместо костылей поверх чужих сервисов
© Claude
Please open Telegram to view this post
VIEW IN TELEGRAM
1917
🔥172
Please open Telegram to view this post
VIEW IN TELEGRAM
😁24🔥147💊4
💙 Пых.конф’25 — главное PHP-событие года!

PHP сегодня в самом расцвете сил:

• 20 человек в ядре, финансируемых PHP Foundation.
• Релизы каждый год с десятками новых фичей.
• Async, типизация, атрибуты, выразительный синтаксис.
• Обслуживает миллиарды пользователей по всему миру.

Оставалась только одна проблема — русскоязычным инженерам не хватало пространства для обсуждения этим тем. Мы её решили.

Пых.конф — абсолютно новая конференция с актуальной программой, доступными билетами и насыщенным offstage-движем.

• Асинхронность и протоколы для неблокирующего I/O.
• RAG в PHP-бэкендах и круглый стол «Кодим с ИИ».
• Архитектурные каноны: DDD, модульность, идемпотентность.
• Производительность: от памяти и массивов до воркеров и CI.
• Yii3, Doctrine, Swoole, WordPress и Битрикс — экосистема во всей красе.
• Не только PHP: YDB, Postgres, Docker, OpenAPI.
• Fail-митап и Открытый микрофон для всех, кто захочет высказаться.
• Игры и конкурсы на стендах партнёров — компаний, преданных PHP.

Мы сделали то, чего сами ждали много лет. Не хватает только тебя.

Забрать билет | Ничего не пропустить | Собрать свою программу
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1814🤯1
#ТоксикСреда

Помните такой журнальчик "В мире PHP"? В выпуске №2 я в шутку писал следующее:

RoadRunner скоро будет не нужен, т.к. будет переписан с этого медленного Golang на PHP. Наконец то! Встречаем PHPStreamServer. Здесь пока только HTTP плагин, но, надеюсь, всё будет.


Я думал, что он просто умрёт тихой смертью, особенно на фоне втаскивания FrankenPHP в кор... но нет! Пару дней назад вышел PHPStreamServer 0.7.0, а сегодня он уже собирает овер дохера лайков на Reddit.

Автор пишет:
Для меня сейчас это попытка создать полностью (на 100%) асинхронное приложение на Symfony... Вероятно, можно было бы интегрировать и Laravel, но я так не думаю.


Ну, что тут сказать... удачи и земля пухом! Впереди чувака ждёт самое интересное, т.к. сейчас в бандле IO операции пока что блокирующие.
Как раз сегодня смотрел на Symfony HTTP Kernel и прифигел с этого лютого говнокода.
Я, значит, что-то там пытаюсь улучшить в бенчах TechEmpower: смотрю на говно в официальных бандлах и костыли в неофициальных, и везде то лишняя конвертация в PSR-7, то просто лишний код, то какая-то херня с рефлексией, то ещё какие-то навороты в цикле запросов.

И всё это из-за того, что весь HTTP Foundation написан через жопу. Вызовы echo захардкожены в приватных методах, всё негибко и максимально всрато.

Главное в симфони пакетах не смотреть код! Если читать доку исключительно, то симфа отличная.
Кирилл Несмеянов


Если и любить фрейморк только за доку, то есть и более достойные альтернативы.

Не знаю, как у вас, но у меня с каждым заходом в код симфы или RFC от симфонистов укрепляется мнение, что FrankenPHP активно зафорсился разработчиками Symfony только для того, чтобы их говнокод смог нормально работать в современном мире. И чтобы никто не сказал, что франкен на самом деле – говно, они специально не рефакторят код фреймворка, замедляя этим другие рантаймы.

Возможно, это не умышлено и симфонисты просто попали в замкнутый круг костылей:
- "сейчас сделаем костыль, а потом сделаем нормально";
- это "потом" не наступает;
- предыдущий костыль подпирают другим костылём и всё начинается сначала.
Но как-то не складно.
127🔥7
Сегодня бороздил просторы LinkedIn и наткнулся на вопрос:

Can you spot the issue in this snippet?

$users = User::where('status', 'active')->get();

if ($users->count() > 0) {
$users = $users->where('role', 'admin');
}

return view('users.index', compact('users'));


The code runs without errors, and the output even looks fine.
But there’s a hidden conceptual problem here that could cause serious trouble in real-world projects.

Question:
Where exactly is the problem, why is this approach risky, and what would be the correct way to fix it?


Автор радуется, что код работает без ошибок и даже «выглядит нормально», но на там есть ловушка. (Кстати найдете ли вы ее?. Можете в коментах рассказать)

> ❗️ Проблема в том, что после ->get() мы уже получаем Collection и фильтруем данные в памяти (Collection::where()), а не в базе (Builder::where()).
На маленьком датасете всё выглядит красиво, а на проде с тысячами пользователей — вываливается лишняя нагрузка, лишнее потребление памяти и потеря ожидаемого поведения.


И вот что интересно.
С одной стороны, охуенный «тест на внимательность». Готов ли ты за джунами такую хуйню искать?
С другой — не демонстрация ли это проблем в Eloquent и Collection?

Фреймворк гордится тем, что «очень простой и интуитивный», но именно эта простота рождает ситуации, где:

- джун легко спутает QueryBuilder и Collection
- визуально одинаковые методы (where) на самом деле делают принципиально разное

ошибка не выдаст exception, а тихо превратится в баг производительности.

Вопрос к вам: А для вас #Laravel все еще говно?
223😁175🤔3💩3
Media is too big
VIEW IN TELEGRAM
🔥74🤮2
#ТоксикСреда, фартаны.

Всех нас уже изрядно заебдостали отовсюду вылезающие конструкторы MCP-серверов на PHP.
Предлагаю быстро пройтись по каждому MCP SDK, который приходит на ум.

1. symfony/mcp-bundle — бридж на symfony/mcp-sdk (бывший php-llm/mcp-sdk).
Здесь тулзы описываются дедовскими методами: типа JSON-schema через PHP-массивы. Кто-то скажет "низкоуровнево", я скажу "всрато". Не ведитесь на бренд, там всё из говна и палок.
Кстати, если вы всё ещё верите в Symfony и хотите как-то исправить этот AI Platform, то записывайтесь на хакатон, а то они уже совсем отчаялись.

2. logiscape/mcp-sdk-php — использовался на практике в CTX. HTTP Transport нормальный (портирован с Python SDK), но роутер — говно: RegisterHandler руками, угадываешь параметры, никаких мидлварей. Пришлось много переписывать. Архитектура не хорошая и не плохая (никакая). Такое бывает, когда бездумно переписываешь с Python.

3. pronskiy/mcp — от Романа Пронского.
По доке выглядит удобно и минималистично, но не для сложных задач.
Рома хайпнул, разработка заморожена. Сделано поверх logiscape/mcp-sdk-php 👆

4. laravel/mcp — кажется, Laravel подсмотрели решение у Ромы, но что-то пошло не так и у них получилась хуйня неюзабельная.
Схемы создаются через громоздкий билдер, где необходимо руками описывать каждое поле. LLM возвращает массив, и дальше сам разбирайся: никаких DTO, никакой валидации.
Подходит только для Hello World проектов. Можно сразу скипать.

5. php-mcp/server — MCP из Нигерии.
Выглядит прилично: схемы генерируются из аргументов методов с атрибутами, есть invocable классы. Но дьявол в деталях: DTO превращает в "type object", собственный JSON-schema валидатор строже стандарта, handler фильтрует аргументы и теряет данные.
Чтобы это заработало нормально, пришлось экстендить половину internal классов. Интеграция на пороховой бочке 👇

6. spiral/mcp-server — обвязка над php-mcp/server от инженера Spiral Scout 😎, сделанная с умом .
Решены ключевые проблемы базовой и других библиотек из подборки: вместо громоздких функций с десятками аргументов или всратых массивов используются DTO с атрибутами. По ним обнаруживаются тулзы и из них же генерируется JSON-схема через spiral/json-schema-generator. Входящие данные маппятся через Valinor с валидацией.
Подключается одним bootloader'ом, легко настраивается и интегрируется с любым сервисом.


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

Берёшь такую херню для интеграции с Task manager, где надо создавать задачи с подзадачами (~10 полей с вложенными DTO и валидацией), понимаешь что нужно что-то другое. Это не тот кейс из доки типа "тут пара аргументов $a и $b, оба строки, а JSON-схему ебани массивом". И вот уже сам сидишь и переписываешь пол пакета.

В общем, спасибо всем пацанам, которые тащат нормальные пакеты, и тем, кто им помогает ❤️
🔥2512😁6