![](https://habrastorage.org/webt/ld/1n/5z/ld1n5zudisrnylf1qk7n_9xka0c.jpeg)
Свежая подборка со ссылками на новости и материалы. В выпуске: все про файберы и асинхронный PHP, а также новые лямбды, пересечения типов и другие предложения для PHP 8.1. Ближайшие мероприятия, порция полезных инструментов, статьи, подкасты, видео и PHP Дайджест Стрим.
Приятного чтения!
Новости
- Ближайшие мероприятия:
- 8 апреля (четверг), онлайн, Митап про безопасность от томского PHP-сообщества — Доклады от Skyeng, Yii Core Team и Userstory.
- 24 апреля (суббота), офлайн + онлайн, Митап нижегородского PHP-сообщества с участием Валентина Удальцова (Пых/PHP Point). Ссылка на трансляцию.
- 15 мая (суббота), офлайн + онлайн, Митап казанского PHP-сообщества — Говорим про тесты, трейты, kPHP, devops в монолите и опыт перехода на Go. Ссылка на трансляцию.
- 28 июня (понедельник), офлайн, Москва, PHP Russia, 2021.
Полный список всегда доступен на phpcommunity.ru.
Async PHP
- [RFC] Fibers — Файберы будут в PHP 8.1
После долгих обсуждений и споров с мейнтейнерами Swoole предложение по файберам наконец-то принято.
Файбер — это блок кода, у которого есть свой стек (переменные и состояние). Он может быть запущен, приостановлен или прерван полностью в любой момент из основного кода или другого файбера. Их можно применить для реализации зеленых тредов в PHP.
Скрытый текст$fiber = new Fiber(function (): void { $value = Fiber::suspend('suspend'); echo "Value used to resume fiber: ", $value, "\n"; }); $value = $fiber->start(); echo "Value from fiber suspending: ", $value, "\n"; $fiber->resume('resume'); > Вывод этого кода: Value from fiber suspending: suspend Value used to resume fiber: resume
Значит ли это, что в PHP 8.1 будет асинхронность из коробки?
Нет. Для асинхронных штук все еще надо будет использовать ReactPHP, Amp или подобные решения. Но использовать асинхронный код, и особенно интегрировать асинхронные блоки в традиционный код, будет намного легче.
Подробнее про файберы можно почитать по ссылкам:
• Fibers — PHP 8.1 — Краткий пересказ RFC от PHP.Watch.
• Файберы PHP: Новый шанс для асинхронного PHP? — Хороший разбор от мейнтейнера ReactPHP про суть файберов и типичные заблуждения.
В PHP 8.1 файберы будут доступны из коробки в виде забандленного расширения ext-fiber. Но также автор говорит, что расширение будет обратно совместимым с PHP 7.2.
- Мифы об асинхронном PHP — Сергей Жук рассказывает основы: чем отличается конкурентность от параллельности, потоки и процессы, что такое неблокирующий ввод/вывод. И развенчивает популярный миф от том, что асинхронный PHP не является «по-настоящему асинхронным».
- Asynchronous PHP — Multiprocessing, Multithreading & Coroutines — Еще один пост об основах асинхронности в PHP от участника core team Laravel.
PHP Internals
- [RFC] Auto-capturing multi-statement closures
Сразу два предложения от Larry Garfield и Nuno Moduro по улучшению лямбд.
В первом предлагается сделать короткие лямбды многострочными и с автозахватом переменных из скоупа.
То есть сейчас можно вот так:
$y = 1; $fn1 = fn($x) => $x + $y;
или вот так:
$fn2 = function ($x) use ($y): int { // ... return $x + $y; };
А предлагается вот так:
$c = 1; $foo = fn($a, $b):int { // ... $val = $a * $b; return $val * $c; };
- [RFC] Short Functions
В этом RFC предлагается разрешить использовать стрелочный синтаксис в методах и обычных именованных функциях.
// Было function add(int $a, int $b): int { return $a + $b; } // Стало function add(int $a, int $b): int => $a + $b;
Пример с короткими геттерами:Скрытый текстclass Person { public function __construct( private string $firstName, private string $lastName, ) {} public function getFirstName(): string => $this->firstName; public function getLastName(): string => $this->lastName; public function getFullName(): string => $this->firstName . ' ' . $this->lastName; }
Если предложения будут приняты, то синтаксис функций в PHP будет полностью консистентен и описывается вот такимиправилами• Символ=>
указывает выполнить выражение справа во всех случаях (функции, лямбды, массивы, match).
• Скобки{ ... }
обозначает блок кода, в котором может бытьreturn
.
• Ключевое словоfunction
означет что автозахвата переменных нет.
• Ключевое словоfn
обозначает, что выполнится автозахват переменных по значению.
• Функция с именем объявляется глобально на этапе компиляции, Функция без имени объявляется локально как замыкание в рантайме.
- [RFC] Deprecations for PHP 8.1
Уже по традиции в каждом релизе часть неконсистентных функций и поведений объявляется устаревшими. В версии PHP 8.1 они будут бросать dreprecation notice, а уже PHP 9 будут удалены полностью.
Пока ничего сверхпримечательного:mysqli::init()
, функции key(), current(), next(), prev(), and reset() на объектах, и много еще подобного. - [RFC] Pure intersection types
В PHP 8.0 были добавлены объединенные типы, а в данном RFC предлагается добавить пересечения типов.
Синтаксис вот такойTypeA&TypeB
и означает, что переменная должна одновременно бытьinstanceof TypeA
иinstanceof TypeB
.
class A { private Traversable&Countable $countableIterator; public function setIterator(Traversable&Countable $countableIterator): void { $this->countableIterator = $countableIterator; } public function getIterator(): Traversable&Countable { return $this->countableIterator; } }
Предложение называется pure intersection types, потому что комбинации с union типами не поддерживаются и оставлены на рассмотрение в будущем. - [Draft] Add FPM early bootstrapping mode
В этом черновике Benjamin Eberlei (автор атрибутов в PHP 8) предлагает добавить опциюfpm.bootstrap_file
в которой будет путь к скрипту. Этот скрипт будет выполнен перед тем, как FPM процесс начнет слушать входящие соединения. При этом память и состояние из этого скрипта шарится со скриптом, который отрабатывает на FPM-соединение, то есть запрос.
Другими словами, можно вынести бутстрап часть приложения в отдельный скрипт, который все еще выполняется на каждый запрос, но не в момент, когда устанавливается соединение, а чуть раньше, когда процесс только начинает слушать.
То есть это что-то типа улучшенного auto_prepend_file.
- PHP JIT/arm64 port — Ребятки из ARM подключились и делают поддержку PHP JIT на ARM-процессорах.
- [RFC] mysqli bind in execute — Принят.
Инструменты
- PeachPie 1.0.0 — Вот уже 5 лет в рамках проекта PeachPie развивается компилятор PHP под .NET. Предствален стабильный релиз и теперь PeachPie позволяет рассматривать PHP как нативный язык .NET платформы. Применение: миграция приложений, кроссплатформенная разработка, другие экзотические кейсы.
- sj-i/php-fuse — FFI биндинги для libfuse — можно сделать свою виртуальную файловую систему из чего угодно. В примерах есть ФС из PHP массива.
- parsica-php/parsica — Построитель парсеров с необычным синтаксисом:
$parser = between(char('{'), char('}'), atLeastOne(alphaChar()));
- spatie/period — Библиотека позволяет делать сложные сравнения дат, например, найти пересечения периодов, разницу, пробелы, крайние границы и прочее.
- pemistahl/grex — Инструмент написан на Rust, но штука мегаполезная. Генерирует регулярные выражения по входным данным. То есть вводите одну или несколько строк, которые должны проходить регулярку, а на выходе получаете паттерн, котороый нужно слегка подправить.
- i18n Ally JetBrains plugin — Плагин PhpStorm для извлечения захардкоженных строк из Twig и PHP в YAML, JSON и XLIFF файлы.
Видеодемо. Один из контрибьюторов плагина Edmund Beinarovic придет на стрим рассказать про плагин подробнее.
Symfony
- Добавляем symfony/stopwatch во сервисы, не меняя их — О декораторах с помощью Ocramius/ProxyManager.
- Делаем передачу параметров в Twig с типами
- Неделя Symfony #743 (22-28 марта 2021)
Laravel
- Laravel Octane — На Laracon Online Тейлор Отвелл представил универсальный пакет для запуска высокопроизводительного Laravel поверх Swoole или RoadRunner.
- Laravel Query — Плагин для PhpStorm, который интегрирует Eloquent запросы с инструментами БД — автодополнение таблиц, колонок, и прочее.
- ryangjchandler/orbit — Драйвер для Laravel Eloquent, чтобы хранить данные в обычных файлах.
- Время ответа от 100ms -> 40ms -> 1ms или как делать кеширование ответов в Laravel.
Еще немного про сервисный слой в PHP
Laracasts: Laravel 8 с нуля
Laravel Worldwide Meetup #7
Laravel-дайджест (8–21 марта 2021)
Yii
- yiisoft/html — Еще один пакет из семейства Yii 3. На этот раз для генерирования тегов HTML.
Статьи
- Используем монорепозиторий для Composer пакетов
- Nodes Nodes and the Visitor pattern — Довольно интересный пост о том, когда и как стоит применять графы/деревья и шаблон «посетитель».
Когда объектов недостаточно.
Разделение кода и текста: прототип.
Теория программирования: пакетные принципы и метрики.
Нам точно нужен фреймворк?
Как дойти до CQRS, если у тебя PHP
Аудио/Видео
Feature Flags для ReactJS и PHP — Как впилить Feature Flags для CI/CD в проект на ReactJS и PHP.
Подкаст Между скобок №13 — В гостях Антон Жуков рассказывает про gRPC.
Подкаст PHP Internals News #79 — C Никитой Поповым про
new
в инициализаторах.
Сообщество
Стрим по мотивам PHP Дайджеста вместе со мной сегодня проведет Петр Мязин, автор подкаста Пятиминутка PHP.
Разберем новости и ссылки из выпуска с подробностями и деталями, и пообщаемся с гостем про плагин для PhpStorm i18n Ally.
Начало в 19:00 Москва, Минск, Киев.
Если вы заметили ошибку или неточность — сообщите, пожалуйста, в личку хабра или телеграм.
Больше новостей и комментариев в Telegram-канале PHP Digest.
Прислать ссылку
Поиск ссылок по всем дайджестам
← Предыдущий выпуск: PHP-Дайджест № 200