PHP Fart Time
1.89K subscribers
113 photos
7 videos
2 files
207 links
Привет, фартаны!

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

Авторы контента: @roxblnfk и @butschster
Download Telegram
#ТоксикСреда, чюваки.

⚠️ Внимание: в посте присутствует мат.

На прошлом #RandomBeer, кроме прочего, зашёл разговор за важность умения посылать нахуй.
В одном кейсе у посылающего вырастала ЗП после каждого посылания. В другом кейсе важный скилл помогал не становиться "дежурной жопой" при разборах полётов.
"Дежурная жопа" — это человек, на которого всегда сваливают всю грязную работу, неприятные обязанности и проблемы, которые никто другой решать не хочет. Это тот, кто вечно "крайний", кому достаются все шишки и кто разгребает последствия чужих косяков, потому что кто-то же должен этим заниматься.


Отмечу, что посылание нахуй может помочь и в, казалось бы, этичном и альтруистичном опенсорсе: важно отклонять запросы на фичи и не кидаться на каждые сообщения о баге или призывы о помощи:
- Фичами, не вписывающимися в видение проекта, можно загубить идею или скатиться в комбайн типа Winamp или Nero. Может оказаться так, что эта фича нужна только одному проценту пользователей, которые даже не поддерживают проект.
- Баги могут оказаться не багами, а результатом неправильного использования.
- Забивая на приоритетные задачи можно так и не развить проект. И это не тоже самое, что "сначала пройду все побочки, а потом основной квест".

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

Призываю в комментах поделиться опытом применения такого фундаментального навыка в контексте IT.
1😁2713🔥1🤬1
Очередная #ТоксикСреда.

Как не хотелось не трогать сам PHP, но придётся, потому что моя жепь с этого немного подгорела на #RandomBeer в предыдущую пятницу.

PHP Lazy Objects #Article
137
#ТоксикСреда, фартаны. А значит пришло время опубликовать рецензию от анонимного фартана на обзор 🌶 POVILAS NEW STARTER KIT (Подправил только грамматику):

Бля, ну какая же это хуйня!
Похоже на линч, только он там разбирает пакет Повиласа. И все что он сделал, это: посмотрел на композер, доебался к версии PHP 8.2, мол в Laravel 8.3, пошёл проверить/показать и оказалось, что там тоже 8.2. Потом зашел в дашборд и закончил на этом.
Большую часть времени он нес хуйню.


Такой пересказ много информативнее, чем от современных LLM 😹

Я сижу на реддитах, твиттерах и в разных En чатах; вижу разные видосы и доклады.
И я вам ответственно заявляю: уровень технического материала многократно выше в Ru сообществе, чем в En!
Про статьи говорить сложно: раньше жемчужины попадались и тут и там, однако сейчас всё наполнилось AI-сгенерированным шлаком и качество сильно просело везде.

Так что давайте скажем спасибо Д. Елисееву, В. Удальцову, П. Бучневу, Д. Щуцкому, Д. Кириллову, К. Несмеянову, С. Пантелееву, всей подлодке, участникам Пыхапов и PHPRussia, и другим ребятам, которые остаются с нами и делают классный контент! Ну и мне, если останется.
🔥1072210
В нашей ламповой группе появился тред по охоте за головами (если ссылка не работает, то заходим сюда и клацаем 👨‍💻HR).

Последнее время всё чаще слышу от разработчиков, что они ищут работу.
Усугубляющие факторы:
- AI угрожает заменить всех разработчиков от мидла и ниже.
- Те разработчики, что выше мидла, неизбежно скуфеют. В PHP вообще остались одни старики. А эйджизм нынче популярен.

Работу я вам не предлагаю, но площадку для нытья — почему бы и нет? #ТоксикСреда всё-таки!
Please open Telegram to view this post
VIEW IN TELEGRAM
15🔥119
Вчера прошёл PHPVerse.
Были пара хороших докладов (про MCP и PHP Foundation) и тонна маркетинга.

А сегодня #ТоксикСреда.

Тон задаёт Nuno Maduro, который считает, что 100% PHP разработчиков мечтают о функции dd() в ядре.
У меня нет особых сомнений, что этого хотят >95% его фанатов, но зачем это проецировать на нормальных людей?
Там даже нашёлся подписчик, который забыл, что великий ларовский dd() на самом деле из Symfony.


Давайте накидаем идей для PHP Foundation, чтобы dd() никогда не попал в ядро.
Напоминаю, что функция fart() уже почти в ядре, осталось только сделать RFC.
27😁11🔥6
* В догонку к #ТоксикСреда

Преданный подписчик и фанат Нуно продолжает вести наблюдение.
Бранные слова заменил аналогами.

Ещё этот посмотрел и поржал.
он делает код ревью, х*** [проекта] на пять строчек и говорит "как же это классно, когда все классы разложены по типам по папочкам", типа модели в одной папочке, контроллеры — в другой. Зашел в модели и видишь все модели и понимаешь как приложение устроено.
Он еще своими экшенами подз*** [надоел].
Короче, это — не синьорное ревью, это — говноревью, где чел просто смотрит на код и сверяет его с тем, как в доке L*** [фреймворка для новичков]. Да это б*** [вообще] не ревью!


———

Вчера в перделке компетентные профессионалы вспомнили про хайповый нынче подход SOSAL. Из статьи:
Для меня название – это не самое важное в подходе, более важным критерием оценки является эффективность и возможность оптимизации процессов в команде. Были также предложены различные варианты названия, такие как LASSO и LASOS.

А ещё вчера по работе мне довелось поближе познакомиться с RAFT.
И как-то это всё сложилось в желание написать, что название — всегда важно.

Вот представьте:
🔥 Алгоритм назывался бы не RAFT, а FART. Тогда спеку читали бы через смех, но от того она и запомнилась бы лучше. FART over cluster.
🔥 Наш канал назывался бы PHP RAFT TIME. Да я бы сам от него отписался!
🔥 А Buggregator был бы, прости хоспаде, Ray Server или каким ни будь Error Catcher. Без изюминки и характера.
Please open Telegram to view this post
VIEW IN TELEGRAM
18😁8🔥32
#ТоксикСреда

Помните такой журнальчик "В мире 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
#ТоксикСреда, фартаны.

Всех нас уже изрядно заебдостали отовсюду вылезающие конструкторы 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-схему ебани массивом". И вот уже сам сидишь и переписываешь пол пакета.

В общем, спасибо всем пацанам, которые тащат нормальные пакеты, и тем, кто им помогает ❤️
🔥3513😁6
PHP Fart Time
Без лишних слов, анонс: сегодня вечером опробуем Yii3 App 1.0.0. https://www.youtube.com/watch?v=ksjGwhvVcN8
Было время переспать с мыслями по Yii3 App.
Хвалебных слов не будет, ибо #ТоксикСреда. Но ребята и так знают, что они молодцы 🫡
Мой технический разбор из двух частей в дополнение к стриму:

🖼️ Массивы уже не айс. Всё-таки времена PHP 7.4 позади.

Обратите внимание на то, что параметры (params) очень хорошо ложатся на DTOшки. DTOшки тоже хорошо сериализуются и десериализуются, кладутся куда угодно, версионируются по semver.
Бонусы очевидны: типизация, автокомплит, не надо знать "путь" до нужного конфига во всеобщем $params. В DTO также можно добавлять атрибуты для настройки мерж-планов или даже авторезолвинга альясов.

# Было
/**
* @var array $params
*/
Foo::class => static function() use ($params): Foo {
return new Foo($params['foo/bar']['option']);
}

# Стало
Foo::class => static function(FooConfig $config): Foo {
return new Foo($config->option);
}


🖼️ Про кашу параметров и структуру: мы вынесли тезис, что в куче параметров чёрт ногу сломит. Хрен найдёшь то, что ищешь.
Однако, я знаю как этого избежать. Всё дело в структуре проекта!

Предлагаемая структура "как в Laravel" проклята. Группировка по типу классов, мол "тут контроллеры, тут хендлеры, тут ещё что-то", — тупиковый путь.
Вот если бы сразу сгруппировать по фичам или модулям, то что получится? Можно раскидать и перегруппировать не только контроллеры/сервисы/etc , но и параметры с конфигами DI.
Ребята, поработайте над структурой!

🖼️ Нельзя получить Request из контейнера: надо сначала получить RequestProvider, затем дёрнуть на нём метод get.

Оно понятно, почему так:
- Мало кто знает, но PSR контейнер по спеке должен быть идемпотентным: на один и тот же id возвращать всегда один и тот же результат. Там не предусмотрены non-singleton биндинги.
- А раз в контейнере всё синглтон, то реквест туда не положишь из-за его динамической натуры: в long running реквест будет каждый раз другой, также он может измениться в PSR мидлварях.

Но не понятно, почему платить за это должны разработчики. Как по мне, плата высокая.
Решить, кстати, эту проблему можно кучей разных доступных способов. Решайте! :)

🖼️ Чтобы уметь работать в неумираемом режиме, Yii опирается на два столпа: дедовские ресеттеры и иммутабельность. Ресеттеры полагаются на события PSR EventDispatcher.
Я доку не читал (а кто её вообще читает?), но надеюсь, что диспетчер событий не навязывается для использования в юзер-ленде.
И если ресеттеры — удел фреймворков, которые не смогли в архитектуру, и для исключительных случаев, то иммутабельность — очень хорошо. Я бы рекомендовал использовать больше иммутабельности и одноразовых объектов, чтобы стейты юзеров не текли, и им не приходилось писать ресеттеры, которые они всё равно писать не будут.
То, что мы видели на стриме мне не понравилось: стейт контроллера протекает. Да, я бы сам не писал такой код, но мы же говорим про фреймворк общего назначения уровня "домохозяйка+". Ну и напомню: если висит ружьё, то оно обязательно выстрелит.
Please open Telegram to view this post
VIEW IN TELEGRAM
16💊5🔥3🤔21
Сегодня наткнулся на очередной пост в LinkedIn о том, что в Laravel добавили кнопку "Скопировать Markdown" специально для AI, и кто-то пошел дальше и запилил пакет с кнопками Ask ChatGPT / Ask Claude прямо на странице ошибки.

И я призадумался 🤔 ибо #ТоксикСреда.

Если разработчику нужно обязательно спросить у AI, чтобы понять, что за ошибка в его же коде — это выглядит пугающе.

Мы же таким образом выращиваем не программистов, а AI-операторов, которые без LLM даже стек-трейс не смогут прочитать и понять, что же они там наговнокодили/вайбкодили.

Ну а ты собираешься спрашивать у AI про ошибки в твоем же говнокоде? Не боишься получить дозу кибер-унижения? Поделитесь кейсами которые было сложно дебажить и где бы помог AI 👇
😁33136
#ТоксикСреда в пятницу! Почему бы и нет?

Зацените пост от JetBrains: Moving PHP open source forward
JB говорит, что в следующем году будет финансово поддерживать пятерых опенсорсеров. Одобряю такое движение в любом случае.

Уже определены 4 опенсорсера:
- Saif Eddin Gmati, разрабатывающий Mago. Ранее помогал с парсером PHP ныне почившего PXP.
- Markus Staab, который контрибутит в PHPStan и AMPHP
- Kyrian Obikwelu — наш любимый нигериец, который смог.
- Sjon Hortensius, создатель 3v4l.org. Этому товарищу я тоже донатил когда-то.

Ситуация с Кирианом выглядит забавно. Чувак навайбкодил свой MCP, который, в прочем, на фоне остальных выглядит очень даже неплохо. А затем его наработки смержили с Symfony AI и получилось говно официальный MCP сервер.
Почему забавно?
Да чувак просто стал героем у себя в стране! Загремел в PHP Official MCP dev team, да ещё и бабки за это поучает сравнительно неплохие (поресёрчил, средняя ЗП айтишников в Нигерии 100-300$/мес).
Причём на деле разработка официального MCP встала, а JB пишут, что платят за "активное изучение возможности искусственного интеллекта и машинного обучения на PHP" 😆.

Но пост не об этом.

Вы, верно, заметили что пятый разработчик не определён. И JB в посте сказали "накидывайте варианты, кого поддержать".

И вот тут меня подбомбило 😠
Simon Hamp, который уже более двух лет лезет во все щели со своим NativePHP, затвитил "а давайте срубим куш и, может быть, NativePHP когда ни будь станет бесплатным". После этого сотни хомяков побежали срать фразой nativephp в твиттере, в блоге JB и везде.
NativePHP — технологический мусор, а с позиции маркетинга уже наравне спаму. У них есть свой закрытый платный продукт, и это точно не тот опенсорс, которым мы пользуемся и который остро нуждается в поддержке.

Я предлагаю законтрить хомяков и заявить везде про BosonPHP. Люди должны знать, что есть более технологически правильные альтернативы.

Да, JB всё-равно не выберет Кирилла, поэтому надо поддержать что-то ещё:
CSFixer, Psalm, RoadRunner, Infection, Xdebug, Buggregator. То, что действительно полезно и не приносит прибыли разработчикам.

Давайте не поленимся, зайдём в блог JB (кто может и в твиттер) и накидаем им за Boson, Psalm и RR в комментарии
Ток без хейта плз )
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥367💩2
#ТоксикСреда продолжается.

Вокруг какой-то скам. Попробовал я законтрибьютить в этот ваш официальный MCP SDK. Это был худший опыт.

1. Нет понимания, кто за что отвечает.
2. Лейблы в ишуях как будто стоят денег, их стараются игнорировать и экономить, чтобы лейблы не кончились.
3. Milestone? не, не слышали. Вот как выглядит у меня, например.
4. Проекты в Github? Тоже не слышали. Хотя всегда же круто иметь проект для управления разработкой, как здесь.
5. Я сделал PR и пожалел. Думал буду контрибьютить, но они таак долго все делали, иногда тупо игнор на несколько дней и понять, что происходит прям проблема. У меня также бывает конечно, но я один и не всегда есть время, а их больше 3-х! Желание пропало продолжать, т.к. пока получишь фидбек, уже забудешь что хотел и потом опять искать время.
6. Некоторые PR висят уже месяц!!!! А с такой помпой анонсировали нам этот MCP, мол приходите, контрибьютте, что такая команда собралась. По факту они заняты чем угодно, только не этим пакетом.
7. Они в SDK добавили фичей который к SDK не имеют отношение, типа Discovery. Это хуйня которая сканирует проект на атрибуты и их регистрирует. Это может и полезная фича, но SDK не должен мне диктовать как мне искать тулзы и т.д. Я хочу свой функционал для этого, зачем мне их зависимости? Моя ишуя, где я говорю, что хуйню делают. Но у них свой путь.

С учетом их подхода к управлению проектом и разработкой (ни лейблов, ни проекта, ни milestone) выглядит так, что собралась команда мечты, которая до этого не занималась командной разработкой.

Christopher Hertel, чувак из Symfony, вообще жжот. Я начал код писать, а мне IDE strict_types по умолчанию во все файлы добавляет.

// Здесь должен быть испанец со своим смехом

А оно у них удаляется потому что в cs fixer стоит

'declare_strict_types' => false,


Я создаю issue, мол давайте втащим.

// Здесь должен быть испанец со своим смехом

А там говорят, что в Symfony нет и это блядь прчина почему и здесь нет и продвигают в cs fixer эту хуйню.

Strict types just make the language worse, because it encourages the risky practice of casting, without providing any real or significant benefits.
© Nicolas Grekas


По итогу мы имеем команду мечты:
1. Чувак из симфони, который до сих пор не использует strict_types=1 и говорит "нахуй не нужон". А его коллега в тоже время обсуждает добавление в CS Fixer правила удаления strict_types. К'мон гайз, PHP 8.5 на пороге!
2. Нигериец, который вайб-кодер по жизни, чей код я изучил и не считаю его продукт хорошим и могу разложить по полочкам. Знаю только что он знает паттерн ларавел и в этом стиле пишет код. На свой пакет он успешно забил...
3. И еще хз кто там в команде, но они заняты чем угодно, но не этим пакетом.

Продукт получил кучу звезд, но как по мне, он не работает и будет как что-то, что проектировали те, кто в этом не особо то и разбираются. Но на волне хайпа собрали аж тыщу звезд, ну а толку? Это не SDK...

Каждый раз когда я с ними общался, те ответы, которые я получал кроме как "испанский смех" в голове не вызывали.

Смеющийся испанец - это прямая ассоциация всего происходящего вокруг этого репозитория и командой которая им занимается. Они просто к этому не готовы и делают как умеют, а не как надобно.

P.S. Ну и кто, блядь, додумался в SDK засунуть генерацию JSON схемы на аргументы функции???

use Mcp\Capability\Attribute\McpTool;

class CalculatorElements
{
#[McpTool(name: 'add_numbers')]
public function add(int $a, int $b): int
{
return $a + $b;
}
}
3😁438🔥3🤯3💊2
Ничего личного, просто #ТоксикСреда
😁294💊3