Фото: Иван Ганцев.

Подборка свежих новостей и материалов из мира 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




Laravel




Yii




Статьи




Аудио/Видео





Подписывайтесь на Telegram-канал PHP Digest.

Этот дайджест подготовлен совместно с Insolita. Если вам понравился выпуск, поставьте, пожалуйста, ему плюс.


Заметили ошибку или опечатку? Сообщите в личку хабра или телеграм.

Прислать ссылку можно через форму или просто написав мне в телеграм.
Поиск ссылок по всем дайджестам
Предыдущий выпуск: PHP-Дайджест № 213

Комментарии (10)


  1. stalkerxxl
    25.10.2021 14:37

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


    1. dimkanevidimka
      25.10.2021 14:45
      +21

      /dev/null


  1. Tatikoma
    25.10.2021 15:29
    +1

    Ролик называется "PHP за 100 секунд", однако длительность 141 секунда...


    1. TmaZavyalovskiy
      26.10.2021 13:38

      41 секунда закладывалась под рекламную интеграцию, видимо


  1. vudaltsov
    25.10.2021 16:06
    +2

    Режим «цикла» странная идея, ИМХО. Потому что получится, что инициализация приложения будет происходить в цикле каждый раз.

    То есть в обычном лупе

    <?php
    // initialization
    while (true) {
        // handling
    }

    а с -L будет, грубо говоря,

    <?php
    while (true) {
        // initialization
        // handling
    }


    1. pronskiy Автор
      25.10.2021 16:12
      +2

      Он вот такую табличку приводит. То есть экономия только на запуске процесса получается?


    1. joffer
      25.10.2021 16:44

      то есть, раньше если у нас запускался процесс и в цикле while() откручивало какой-то код - весь этот код выполнялся, каждым циклом влияя на процесс - потому что инициализация выполнялась до цикла while().

      А с помощью этого режима инициализацию можно втаскивать внутрь цикла while() - чтобы каждый цикл инициализировало заново. Получается, процесс с while запускается и инициализируется 1 раз с какими-то самыми общими настройками - а потом в каждом цикле while грубо говоря делается что-то вроде одинарного вызова php-fpm (?).

      Перезапускаем не весь процесс, а перезапускаем в каждом цикле процесс - это как-то так работает? Тогда, получается, отработка каждого цикла будет изолирована "а-ля докер" - и при этом потери на инициализацию будут меньше, потому что она будет разнесена на 2 части - 1 для всего процесса, в котором будет запущен этот while()-цикл, а 2ая - инизиализация в каждом цикле while?

      Просто пытаюсь понять, как это работает или как оно должно работать, чтобы от этого был внятный профит на каких-то сценариях


    1. vudaltsov
      25.10.2021 17:19

      Кажется, я понял. Только глобальное состояние остаётся таким же между итерациями того же запуска скрипта с флагом -L. Глобальное в смысле PHP: переменные, объявленные в index-скрипте, или, прости Господи, через global/$GLOBALS. То есть это как в RoadRunner, только без него.


    1. Grikdotnet
      26.10.2021 14:34

      это для тех, кто не знает, про unix-команду watch

      user:/opt/www/acme/src$ watch -n0 php run.php


    1. Khaperets
      26.10.2021 16:19
      +1

      Больше похоже на замену supervisord