
Подборка свежих новостей и материалов из мира PHP.
Конфликт вокруг расширения Swoole и создание форка OpenSwoole; асинхронные фреймворки Amp и ReactPHP выпустили общую реализацию ивент-лупа; PHP 8.1 RC 4; принят первый RFC для 8.2.
Также в выпуске два поста от Никиты Попова, полезные статьи, видео.
Приятного чтения!
Этот дайджест подготовлен совместно с Insolita. Если понравился выпуск, плюсаните пост, пожалуйста.
 Новости
 Новости
- 
Конфликт вокруг Swoole привел к созданию форка OpenSwoole
 Вся суть конфликта изложена в этом треде на GitHub.
 В Swoole был добавлен код, который что-то скачивает с закрытого ресурса: 
 Это, конечно же, можно расценивать как проблему безопасности. Один из контрибьюторов Swoole, Bruce Dou @doubaokun, указал на эту проблему.
 Позже, doubaokun попытался расширить свои права и выпустить релиз расширения на PECL. Его изменения откатили, а он в ответ накатил их снова и в закрытом чате высказывался непотребно в сторону автора Swoole @matyhtf. После чего у Bruce Dou отобрали права доступа к репозиторию и тогда он объявил о создании своего форка.
 История со скачиванием файлов с стороннего сервера, конечно, портит репутацию Swoole. Но я склонен больше доверять авторам расширения, чем Bruce Dou. Вот почему:- Проблемный кусок кода быстро удалили. По словам авторов, планировалось реализовать дашборд для Swoole с отображением всяких метрик. Этот дашборд будет открыт в отдельном расширении.
- Создатель форка за 9 лет существования Swoole сделал всего 49 коммитов и не входит даже в топ-10 контрибьюторов.
- Во время обсуждения RFC файберов, автор форка довольно токсично высказывался в твиттере, при этом отказывался писать в Internals по существу.
 
 Тем не менее стоит отдать должное Bruce Dou, за то, что поддерживал официальный сайт, твиттер и Slack-сообщество Swoolе и вообще занимался популяризацией расширения.
 Будем наблюдать за Swoole и OpenSwoole.
 
- 
Amphp и ReactPHP объединили усилия и опубликовали revoltphp/event-loop
 Команды разработчиков двух популярных асинхронных фреймворков Amphp и ReactPHP выпустили совместную абстракцию событийного цикла на основе файберов.
 Файберы будут доступны в PHP 8.1+ из коробки, а на PHP 8.0 можно поставить расширение ext-fiber.
 По умолчанию ивент-луп работает с использованием системного вызоваselect. Также поддерживаются низкоуровневые событийные библиотеки ev, event и uv. Последняя, к слову, используется в Node.js для ивент-лупа.
 Следующие версии Amp и ReactPHP не будут поставляться с собственной реализацией цикла событий, а будут напрямую использовать RevoltPHP.
 
- 
PHP 7.4.25, PHP 8.0.12
 Багфиксы для актуальных веток.
 
- 
PHP 8.1 RC4
 Четвертый релиз-кандидат доставлен по расписанию. Впереди еще как минимум два.
 Пара свежих видео от Brent Roose:
 
 
- Классный видеоролик — PHP за 100 секунд:
 
 
 PHP Internals
 PHP Internals
- 
[RFC] Deprecate partially supported callables
 Предложение принято. В PHP 8.2 следующие варианты вызова колбэков будут объявлены устаревшими:"self::method" "parent::method" "static::method" ["self", "method"] ["parent", "method"] ["static", "method"] ["Foo", "Bar::method"] [new Foo, "Bar::method"]
 Нормальные вызовы вида"function","Foo::method",["Foo", "method"]и[new Foo, "method"]не затронуты этим предложением. Потому что для них вызов через скобки работает:"printf"('Hello World'); "Foo::method"(); [new Foo, "method"]();
 
- 
[RFC] Deprecate dynamic properties
 В текущих версиях PHP, если попытаться записать в несуществующее свойство, то оно будет автоматически создано.
 В современном коде это редко делается намеренно, чаще это опечатка или плохая практика.
 В этом RFC предлагается задепрекейтить и впоследствии удалить возможность создания динамических (необъявленных) свойств.class User { public $name; } $user = new User; // Assigns declared property User::$name. $user->name = "foo"; // Oops, a typo: $user->nane = "foo"; // PHP <= 8.1: Молча создает динамическое свойство $user->nane. // PHP 8.2: Вызывает предупреждение, но все равно создает динамическое свойство. // PHP 9.0: Выбрасывает исключение Error.
 Это изменение не будет касаться классаstdClassи унаследованных от него. Поведение магических__get/__setтакже не затрагиваются этим изменением.
 Также теперь предлагается еще добавить атрибут#[AllowDynamicProperties], которым можно пометить любой класс и тогда в нем можно будет объявлять динамические свойства.
 
- 
Add loop mode (`-L`) in the CLI SAPI
 Интересная идея от Matthieu Napoli, автора Bref.
 Предлагается добавить режим «цикла» для PHP:php -L script.php.
 Это как если запустить скрипт в циклеwhile(true) {}, но только на каждой итерации скрипт изолирован. По сути, это клон поведения PHP-FPM (worker) для CLI.
 Такой режим может пригодиться для всяких воркеров, AWS Lambda и подобных окружений.
 
 Symfony
 Symfony
- В symfony/console добавили автодополнение команд в терминале из коробки. Все пакеты на основе symfony/console автоматически тоже получают автодополнение.
- История нового дизайна документации Symfony — symfony.com/doc.
- Неделя Symfony #773 (18-24 Октября 2021)
 Laravel
 Laravel
- Laravel Tinker — PhpStorm плагин, который позволяет использовать Laravel Tinker прямо в IDE.
- spatie/laravel-site-search — Полнотекстовый поиск для сайта на базе Meilisearch. Статья и видео в поддержку.
- Как работает Livewire (очень подробно).
- 
 Тестирование сложных фич с помощью Laravel и Pest. Тестирование сложных фич с помощью Laravel и Pest.
- 
 Releasing Laravel — Стрим от одного из участников Laravel core-команды, где он демонстрирует процесс релиза пакетов Laravel. Releasing Laravel — Стрим от одного из участников Laravel core-команды, где он демонстрирует процесс релиза пакетов Laravel.
 Yii
 Yii
- Релизы пакетов Yii 3: Yii View 4.0.0, CSRF 1.1.0, Html 2.2.0,Symfony Mailer 1.0.0
 Статьи
 Статьи
- Никита Попов опубликовал два крутых поста про внутренности PHP: Как работает opсache и про раннее связывание в PHP.
- Работа с деревьями в PHP
- Как выполнять HTTP-запросы со сжатием с помощью Curl и PHP.
- smknstd/modern-php-cheatsheet — Шпаргалка по современному PHP.
- Расширенные возможности MessagePack — MessagePack — это бинарный формат для сериализации данных. В посте про расширение системы типов и про другие фишки MessagePack.
- Пара постов по использованию инструмента Rector: Как использовать фреймворки требующие php>=8.1 на более старых версиях php, и Как преобразовать аннотации в атрибуты.
 Аудио/Видео
 Аудио/Видео
- 
 Roadrunner — что дальше? — Запись митапа с R&D командой SpiralScout про дальнейшие планы RoadRunner, а также про актуальные фичи. Roadrunner — что дальше? — Запись митапа с R&D командой SpiralScout про дальнейшие планы RoadRunner, а также про актуальные фичи.
- 
 Топ 10 трюков в PhpStorm от Christoph Rumpel. Топ 10 трюков в PhpStorm от Christoph Rumpel.
- 
 PHP Release Radar — Episode 12: Про CaptainHook — менеджер Git-хуков. PHP Release Radar — Episode 12: Про CaptainHook — менеджер Git-хуков.
Подписывайтесь на Telegram-канал PHP Digest.
Этот дайджест подготовлен совместно с Insolita. Если вам понравился выпуск, поставьте, пожалуйста, ему плюс.
Заметили ошибку или опечатку? Сообщите в личку хабра или телеграм.
 Прислать ссылку можно через форму или просто написав мне в телеграм.
Поиск ссылок по всем дайджестам
 ← Предыдущий выпуск: PHP-Дайджест № 213
Комментарии (10)
 - vudaltsov25.10.2021 16:06+2- Режим «цикла» странная идея, ИМХО. Потому что получится, что инициализация приложения будет происходить в цикле каждый раз. - То есть в обычном лупе - <?php // initialization while (true) { // handling }- а с - -Lбудет, грубо говоря,- <?php while (true) { // initialization // handling } - pronskiy Автор25.10.2021 16:12+2 - Он вот такую табличку приводит. То есть экономия только на запуске процесса получается? 
  - joffer25.10.2021 16:44- то есть, раньше если у нас запускался процесс и в цикле while() откручивало какой-то код - весь этот код выполнялся, каждым циклом влияя на процесс - потому что инициализация выполнялась до цикла while(). - А с помощью этого режима инициализацию можно втаскивать внутрь цикла while() - чтобы каждый цикл инициализировало заново. Получается, процесс с while запускается и инициализируется 1 раз с какими-то самыми общими настройками - а потом в каждом цикле while грубо говоря делается что-то вроде одинарного вызова php-fpm (?). - Перезапускаем не весь процесс, а перезапускаем в каждом цикле процесс - это как-то так работает? Тогда, получается, отработка каждого цикла будет изолирована "а-ля докер" - и при этом потери на инициализацию будут меньше, потому что она будет разнесена на 2 части - 1 для всего процесса, в котором будет запущен этот while()-цикл, а 2ая - инизиализация в каждом цикле while? - Просто пытаюсь понять, как это работает или как оно должно работать, чтобы от этого был внятный профит на каких-то сценариях 
  - vudaltsov25.10.2021 17:19- Кажется, я понял. Только глобальное состояние остаётся таким же между итерациями того же запуска скрипта с флагом - -L. Глобальное в смысле PHP: переменные, объявленные в index-скрипте, или, прости Господи, через- global/- $GLOBALS. То есть это как в RoadRunner, только без него.
  - Grikdotnet26.10.2021 14:34- это для тех, кто не знает, про unix-команду watch - user:/opt/www/acme/src$ watch -n0 php run.php
 
 
           
 



stalkerxxl
Ролик посмотрел... куда резюме на junior отсылать?
dimkanevidimka
/dev/null