Open Source: PHP
402 subscribers
3 photos
47 links
Помощь Open Source продуктам на PHP
Download Telegram
Forwarded from msavin
Export-ignore-check

В целом все крупные библиотеки следят за размером своего дистрибутива, чтобы конечный пользователь не скачивал вместе с архивом либы ненужные файлы, вроде документации, тестов, файлов конфигурации dev зависимостей

Но у меня лично каждый раз боль глазами сравнивать структуру файлов и содержимое .gitattributes (export-ignore директива), тем более часто случается рассинхрон, в том числе и у крупных библиотек (тот же phpstorm-stubs)

В связи с этим написал либу, которая призвана проверить, что там за архив получается из вашей библиотеки (через git archive или скачав напрямую с packagist) и найти там ненужные файлы. Она покажет вам сколько вы сэкономите кБ, вдобавок автоматически может добавить рекомендуемые изменения в ваш .gitattributes.

Я прогнал топ тысячу пакетов с packagist, 470 из них могут быть оптимизированы, так шо возможно и вам пригодится
👍13🔥7
Пофиксить PHP 8.4 deprecations в RoadRunner PHP

👩‍💻 https://github.com/roadrunner-php/issues/issues/39

Нужно обновить пакет version-checker, чтобы он не плевался депрекейтами PHP 8.4
Делается это несложно (можно посмотреть связанные PR в той же ишуе): подключается spiral/code-style, запускается и весь код становится красивым и без депрекейтов.

Пользователи RoadRunner и Temporal, внедряющие PHP 8.4, будут вам благодарны.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥1
Ишуя для тех, кто не хочет кодить

🪲 Добавить Buggregator в список Awesome PHP

https://github.com/buggregator/trap/issues/191
Please open Telegram to view this post
VIEW IN TELEGRAM
👍61
Изменено. Тут была бредовая идея, но теперь вот это:

Несколько проблем PHP CS Fixer и их решения:

- CS Fixer пока нестабилен с новым PHP 8.4 синтаксисом. Поэтому при запуске он падает с предупреждением, мол "запускаешь на свой страх и риск, выстави PHP_CS_FIXER_IGNORE_ENV=1 и будешь сам виноват". Если код пишется без новых фичей PHP 8.4, то ставим ENV и радуемся жизни.

- CS Fixer, как зависимость, тянет много "мусорных" пакетов, которые могут повлиять на другие зависимости проекта.
В этом случае можно заюзать composer-bin-plugin и установить CS Fixer в отдельную папочку, которую можно даже смело заигнорить не только в гите, но и в IDE.

- Хотел предложить добавить им сборку бинарей, но отказался от идеи, т.к. вредя будет больше, чем пользы. Ведь CS Fixer'у важно зависеть именно от PHP проекта.
#yii3

🖼 Добавить дженерик для метода ConnectionInterface::transaction()

В пакете Yii DB (абстракция над СУБД) есть метод ConnectionInterface::transaction(), который выполняет анонимную функцию в рамках транзакции и возвращает её результат.

Необходимо типизировать метод таким образом, чтобы Psalm мог вывести тип результата.

⭐️ Тикет на GitHub
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥2
Во время сегодняшнего стрима обнаружилось, что под свеженький RoadRunner 2025 не все PHP-пакеты обновлены. Нужно в composer.json для зависимости spiral/roadrunner добавить версию ^2025.1

Вот эти пакеты:

roadrunner-php/centrifugo

roadrunner-php/tcp
roadrunner-php/services

Быстро вошёл — быстро вышел, приключение на несколько минут. Зато неоценимый вклад! 😏
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
Forwarded from Пых (Валентин Удальцов)
В PHP-CS-Fixer смержили мой фиксер new_expression_parentheses!

Позавчера состоялся релиз v3.76.0 Kids Playground, туда наконец-то попал фиксер new_expression_parentheses, который мы делали в Open Source цеху (#1, #4). Он убирает скобки вокруг new выражений в соответствии с моим RFC в PHP 8.4.

Вот как включить это правило в .php-cs-fixer.dist.php после обновления:


return new Config()
// разрешаем PHP-CS-Fixer работать на 8.4,
// это вместо переменной среды PHP_CS_FIXER_IGNORE_ENV
->setUnsupportedPhpVersionAllowed(true)
// включаем параллельную обработку файлов
->setParallelConfig(ParallelConfigFactory::detect())
// по умолчанию finder ищет только *.php
// и игнорит директории vendor и .* (.git, .idea, ...)
->setFinder(Finder::create()->in(__DIR__))
->setRules([
'@PhpCsFixer' => true,
'new_expression_parentheses' => [
// убираем ненужные скобки
'use_parentheses' => false,
],
]);


Мейнтейнер Dariusz Rumiński предлагает добавить new_expression_parentheses в сет @PHP84Migration. Накидайте там лайков, пожалуйста. @open_source_php, кажется, у нас есть задачка для подписчиков. 😊
____________

1. Слоники Пых выехали ко мне из Иркутска. Транспортная компания обещала доставить в Москву в течение 9 дней. Жду!

2. Мы вчера с программным комитетом Пых.конф’25
зафиналили на встрече мощнейшую программу. Скоро вывесим на сайт.
👍16🔥5
🔥 Сбор профайлов в PHP через excimer и как их отправлять 🚀

В продолжение темы про #observability решил рассказать, как отправлять данные профайлов, собранные через excimer. Надо сказать, что это не самый популярный модуль для сбора профайлов — и, как по мне, совершенно зря. Потому что это расширение максимально тесно интегрируется в PHP и даёт минимум нагрузки на процессор

Минусы? Конечно — отсутствие визуализации из коробки. Но визуализаторов полно: Pyroscope от Grafana, например. Или Speedscope. Проблема в другом — как туда всё это отправить, ведь excimer не умеет ни в OpenTelemetry, ни в какой-нибудь другой удобный формат. Что делать?

А ничего — написать враппер и адаптеры самому 😎 Чем я и занялся. В итоге появился open source пакет 👩‍💻 https://github.com/excimetry/excimetry

Получился, как по мне, весьма удобный. Я сразу добавил интеграцию с клиентами по OpenTelemetry, данные идут в бинарном формате через protobuf. Есть поддержка:
Pyroscope
Speedscope
Выгрузка на файл
Профайлинг консольных команд

Вот пример использования

use Excimetry\Profiler\ExcimerProfiler;
use Excimetry\Exporter\CollapsedExporter;
use Excimetry\Backend\PyroscopeBackend;

// Create a profiler
$profiler = new ExcimerProfiler();

// Start profiling
$profiler->start();

// Your code to profile here
// ...

// Stop profiling
$profiler->stop();

// Get the profile
$log = $profiler->getLog();

// Send to Pyroscope
$exporter = new CollapsedExporter();
$backend = new PyroscopeBackend(
'https://localhost:4040', // Pyroscope server URL
'my-application', // Application name
['env' => 'production'] // Labels
);

// Send the profile to Pyroscope
$backend->send($log);

// You can also set the backend to send asynchronously
$backend->setAsync(true);
$backend->send($log); // Returns immediately, sends in background

// Add custom labels
$backend->addLabel('version', '1.0.0');
$backend->addLabel('region', 'us-west');


Честно, не знаю, насколько далеко это всё зайдёт — но идея мне реально нравится 💡 Возможно, excimer станет чуточку популярнее благодаря excimetry.

Буду рад звёздочкам на GitHub ⭐️, репостам и вашим комментариям ❤️



Давайте оставаться на связи ☄️
Please open Telegram to view this post
VIEW IN TELEGRAM
👍71
Forwarded from Danil Shutsky
🌙 Проект: MoonShine
🛠 Задача: Миграция с @popperjs/core на @floating-ui в MoonShine (4.x)

Описание:
Библиотека @popperjs/core, используемая в MoonShine для позиционирования всплывающих элементов (tooltip, dropdown и т.д.), переехала в Floating UI. Теперь вместо @popperjs/core следует использовать @floating-ui/dom.

Цель:
В ветке 4.x заменить использование @popperjs/core на актуальную версию из floating-ui. Это позволит избежать зависимостей от устаревшей библиотеки и получить доступ к новым возможностям и оптимизациям.

Убедиться, что:
- dropdown, select, tooltip, модальные окна и прочие компоненты позиционируются корректно;
- работает auto-update позиции при изменении layout;
- тесты проходят
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from PHP Fart Time (Алексей roxblnfk)
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) и остальному инициативному сообществу!
🔥3👍21
Cycle ORM: помочь в ревью UPSERT

Участник сообщества предложил жирный PR, добавляющий UPSERT в Cycle.
Я сейчас сфокусирован на других задачах, поэтому нужна помощь с этой.

Можно ревьювить чисто в своих компетенциях, главное обозначить их в комментарии.
Но желательно знать, что такое UPSERT и как он используется.
Что можно ревьювить:
- API в Query Builder'е.
- Тесты (корректность и полнота тестов).
- Комментарии.
- Кишочки.

На картинке показано, что нажимать, чтобы предлагать изменения: выделяете несколько строк, жмякаете +, кнопка +- для предложения правок.

👩‍💻 https://github.com/cycle/database/pull/231
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11
Forwarded from Alexander Makarov
Кто хочет помочь Yii3, но не уверен в своём коде, есть две лёгких, но очень полезных задачи:

- https://github.com/yiisoft/friendly-exception/issues/37
- https://github.com/yiisoft/error-handler/issues/148

Нужно наделать скриншотов, показывающих фичи, и закинуть в README пакетов + оформить в виде pull request.
👍7
🖼️ PHP Opcodes Language

Плагин для IDEA Ultimate / PHPStorm с языковой поддержкой синтаксиса PHP опкодов.

Если у вас есть опкоды и вы не знаете куда их деть, то можно положить в файл с расширением .phpo и плагин сделает подсветку и небольшую навигацию.

На текущий момент сделано достаточно для комфортного чтения опкодов, но в будущем появится и инспекция с анализом ваших опкодов.

Где и как их собирать удобно – это тема для другого плагина. Он уже в паблике, но полноценной интеграции с Opcodes Language нет.


🔤🔤 https://plugins.jetbrains.com/plugin/27833-php-opcodes-language
👩‍💻 https://github.com/xepozz/php-opcodes-language-plugin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Dmitrii
🖼️ PHP Opcodes Language Плагин для IDEA Ultimate / PHPStorm с языковой поддержкой синтаксиса PHP опкодов. Если у вас есть опкоды и вы не знаете куда их деть, то можно положить в файл с расширением .phpo и плагин сделает подсветку и небольшую навигацию. …
#php

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

- Открываете сборник опкодов
- Клонируете определение опкода в плагине
- Описываете его назначение и примеры: пхп + опкоды

Готовые опкоды можно взять отсюда, остальные придется искать / изучать исходники

👩‍💻 Ссылка на файл, в который нужно добавлять
👩‍💻 Ссылка на php-src со списком последних опкодов
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4
Forwarded from Mikhail Savin
Rector-правило для соблюдения AAA паттерна в тестах

По результатам моего опроса почти половина разработчиков пользуются этим паттерном при написании тестов, но я лично периодически забываю "отбивать" секции комментами

Теперь можно делегировать это Rector'у - добавил правило EnforceAaaPatternRector.
Оно просто вставляет комментарии (и удаляет старые, если они неверно расположены), например:


public function testFoo(): void
{
// Arrange
$date = new DateTimeImmutable('2025-01-01');

// Act
$formatted = $date->format('Y-m-d');

// Assert
self::assertEquals('2025-01-01', $formatted);
}


Если же ваши тесты изначально не структурированы под это, то будут мисплейсы. Например, если вы делаете запрос, ассерты на него, потом новый запрос и новые ассерты (так часто тестят валидацию/авторизацию).
Надеюсь, правило поможет сделать такие нарушения более явными на кодревью
🤔3👍2👎1
Forwarded from gh
Релизик в хату, господа программисты 🎧

https://github.com/wayofdev/laravel-cycle-orm-adapter/releases/tag/v5.0.0

возможно вам будет интересно посмотреть коммит под капотом релиза:
https://github.com/wayofdev/laravel-cycle-orm-adapter/pull/759

Из хайлайтов:
🔧 пофикшены все ci/cd:
• починил psalm
• починил SQL Server тестирование с правильными ODBC драйверами

🗄️ для cycle'истов будет интересен этот файл:
https://github.com/wayofdev/laravel-cycle-orm-adapter/blob/master/.github/workflows/testing-mssql.yml
(тут я сделал полную настройку SQL Server в GitHub Actions с ODBC драйверами, правильными health checks, и совместимостью с ubuntu-latest)

📦 апгрейд зависимостей:
• orchestra/testbench до ^10.0 для Laravel 12 поддержки
• поддержка Laravel 12.x наряду с 10.x и 11.x

🐛 пофикшен баг #752:
• контейнер Laravel теперь возвращает одинаковый инстанс для ORM::class и ORMInterface::class
• больше никаких "duplicate key value violation" ошибок при апдейтах entities

📚 будет интересно для тех кто в PDD и CDD:
https://github.com/wayofdev/laravel-cycle-orm-adapter/blob/master/.cursor/development-guidelines.md - гайдлайны для AI-assisted разработки с реальными примерами
https://github.com/wayofdev/laravel-cycle-orm-adapter/blob/master/.cursor/testing-guidelines.md - гайдлайны для агентного тестирования

(эти файлы дают готовые паттерны для эффективной разработки с AI ассистентами, TDD подходы для багфиксов, Docker workflows, multi-database тестирование, и best practices из реального опыта проекта)

cc: @roxblnfk @butschster

cc: https://github.com/wayofdev/laravel-cycle-orm-adapter
может ли автор выпустить релиз с laravel 12 фиксом?
Please open Telegram to view this post
VIEW IN TELEGRAM
👍101🤮1
Forwarded from PHP Fart Time (Алексей roxblnfk)
Начался Hacktoberfest 2025

Если выполнить задачи в числе первых 10_000 участников, то можно выиграть футболку. Но в РФ её всё-равно не доставят.

Однако, пофиг на футболку. Давайте просто делать Open Source вместе, хотя бы в этот месяц.

Пара советов:

Советую любой вклад в репозиторий начинать с обсуждения:
- Написать в Issue, что собираетесь взять задачу на себя и уточнить, есть ли вещи, на которые стоит обратить внимание.
- Найти ответственного и пнуть в чате.
- Обсудить объём работ, чтобы не делать всё или не попасть в ситуацию, когда часть работы уже сделана где-то ещё.

По Pull Request советую:
- Не делать то, что выходит за рамки Issue, не изменять левые файлы.
- Не делать Force Push, особенно после ревью.
- Не делать большие PR. Это в продуктовых проектах большие изменения проходят с меньшими замечаниями. В опенсорсе большой PR == больше работы для ревьювера.

Вот пара направлений сходу:

1. @terabytesoftw из Yiisoft докладывает: сейчас Yii2 покрыт тестами на 75%. Давайте добьём до 100%.
PR is welcome

2. Подгон от @butschster: ишуи с тегом Good First Issue в репозитории CTX и for-contributors в Buggregator.
3. Ну а я буду просто очень счастлив, если кто-то доделает этот PR (можно прыгнуть на ветку автора, запушить её в свой форк, доделать и затем сделать новый PR)

В PHP сообществе есть ещё пара мест:

- Общий канал по пыховому опенсорсу, в который можно прийти и как мейнтейнер (хранитель кодовой базы), и как контрибьютор (участник, вкладчик).
- Тема опенсорса в нашем чатике, где можно полулзить или обсудить что-то посложнее, чем Good first issue.

———

Кстати, открытое ПО тесно связано со свободными лицензиями.
И тут возникли мысли, а не пора ли нам с Павлом везде внедрять эту лицензию?

PS: Спасибо Владу Шашкову, который следовал этой лицензии и угощал меня пивом на ПыхКонф'2025 🍻
🔥4👍2
📣 Infection – библиотека для мутационных тестов

Infection довольно круто инструменты для проведения мутационных тестов: если тесты проходят, то библиотека меняет исходных код и запускает ваши тесты заново.

Работает здорово, становится всё быстрее, но нет поддержки в IDE.
Я сделал плагин для запуска Infection и раскраски текста в редакторе в красный с обозначением что за тест упал.
Однако, более логичным было бы сделать инструменты как для запуска PHPUnit/Codeception.

Они не делают отдельных интеграций, а используют формат TeamCity для логирования в stdout. Этот лог кушает IDEA, вырезает (для удобства чтения) и строит по нему дерево тестов и их ошибки.

Вот для Infection такого логгера сейчас нет.
Автор сделает, но ближе к концу недели скорее всего.
Если у вас есть силы и желание законтрибьютить в Infection, то переходим по ссылке и хватаем тикет.
https://github.com/infection/infection/issues/2446

TeamCity: https://www.jetbrains.com/help/teamcity/2025.07/service-messages.html#Nested+Test+Reporting
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥3
Forwarded from Пых (Валентин Удальцов)
🤎 Драйвер для NATS от Thesis!

Каждый, кто пишет на Golang, наверняка слышал про NATS. Это платформа для обмена сообщениями, состоящая из двух основных частей: Core NATS (publish-subscribe с at-most-once гарантией и request-reply) и JetStream (персистентные стримы а-ля Kafka).

Мы написали новый неблокирующий драйвер для NATS под PHP, который поддерживает все основные возможности платформы:

• publish-subscribe,
• request-reply,
• jetstream,
• key-value хранилище,
• объектное хранилище,
• атомарные счётчики на основе CRDT,
• пакетная публикация,
• планировка сообщений.


composer require thesis/nats



$nats = new Nats\Client(Nats\Config::default());

$nats->subscribe('foo.*', static function (Nats\Delivery $delivery): void {
dump("Received message: {$delivery->message->payload}");
});

$nats->publish('foo.bar', new Nats\Message('Hello World!'));


Текущий релиз — 0.2.0, но некоторые уже используют драйвер в продакшне! К мажору шлифанём по мелочи и добавим поддержку NATS Service. А ещё после статьи на Reddit нам поставил звезду Ocramius. 😅

GitHub | Thesis Community | nats.io
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5🤨1