Подборка свежих новостей и материалов из мира 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
-
[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/console добавили автодополнение команд в терминале из коробки. Все пакеты на основе symfony/console автоматически тоже получают автодополнение.
- История нового дизайна документации Symfony — symfony.com/doc.
- Неделя Symfony #773 (18-24 Октября 2021)
Laravel
- Laravel Tinker — PhpStorm плагин, который позволяет использовать Laravel Tinker прямо в IDE.
- spatie/laravel-site-search — Полнотекстовый поиск для сайта на базе Meilisearch. Статья и видео в поддержку.
- Как работает Livewire (очень подробно).
- Тестирование сложных фич с помощью Laravel и Pest.
- Releasing Laravel — Стрим от одного из участников Laravel core-команды, где он демонстрирует процесс релиза пакетов Laravel.
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, а также про актуальные фичи.
- Топ 10 трюков в PhpStorm от Christoph Rumpel.
- PHP Release Radar — Episode 12: Про CaptainHook — менеджер Git-хуков.
Подписывайтесь на Telegram-канал PHP Digest.
Этот дайджест подготовлен совместно с Insolita. Если вам понравился выпуск, поставьте, пожалуйста, ему плюс.
Заметили ошибку или опечатку? Сообщите в личку хабра или телеграм.
Прислать ссылку можно через форму или просто написав мне в телеграм.
Поиск ссылок по всем дайджестам
← Предыдущий выпуск: PHP-Дайджест № 213
Комментарии (10)
vudaltsov
25.10.2021 16:06+2Режим «цикла» странная идея, ИМХО. Потому что получится, что инициализация приложения будет происходить в цикле каждый раз.
То есть в обычном лупе
<?php // initialization while (true) { // handling }
а с
-L
будет, грубо говоря,<?php while (true) { // initialization // handling }
pronskiy Автор
25.10.2021 16:12+2Он вот такую табличку приводит. То есть экономия только на запуске процесса получается?
joffer
25.10.2021 16:44то есть, раньше если у нас запускался процесс и в цикле while() откручивало какой-то код - весь этот код выполнялся, каждым циклом влияя на процесс - потому что инициализация выполнялась до цикла while().
А с помощью этого режима инициализацию можно втаскивать внутрь цикла while() - чтобы каждый цикл инициализировало заново. Получается, процесс с while запускается и инициализируется 1 раз с какими-то самыми общими настройками - а потом в каждом цикле while грубо говоря делается что-то вроде одинарного вызова php-fpm (?).
Перезапускаем не весь процесс, а перезапускаем в каждом цикле процесс - это как-то так работает? Тогда, получается, отработка каждого цикла будет изолирована "а-ля докер" - и при этом потери на инициализацию будут меньше, потому что она будет разнесена на 2 части - 1 для всего процесса, в котором будет запущен этот while()-цикл, а 2ая - инизиализация в каждом цикле while?
Просто пытаюсь понять, как это работает или как оно должно работать, чтобы от этого был внятный профит на каких-то сценариях
vudaltsov
25.10.2021 17:19Кажется, я понял. Только глобальное состояние остаётся таким же между итерациями того же запуска скрипта с флагом
-L
. Глобальное в смысле PHP: переменные, объявленные в index-скрипте, или, прости Господи, черезglobal
/$GLOBALS
. То есть это как в RoadRunner, только без него.
Grikdotnet
26.10.2021 14:34это для тех, кто не знает, про unix-команду watch
user:/opt/www/acme/src$ watch -n0 php run.php
stalkerxxl
Ролик посмотрел... куда резюме на junior отсылать?
dimkanevidimka
/dev/null