PHP Дайджест № 197 (11 – 25 января 2021)

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!


Свежая подборка со ссылками на новости и материалы. В выпуске: объекты в качестве ключей массивов и другие RFC предложения для PHP 8.1, запуск WebAssembly в PHP, о коллизиях в массивах, порция полезных инструментов, статьи, видео, PHP Дайджест Live.

Приятного чтения!



Новости и релизы


  • ru PHP Russia переносится на 28 июня 2021 года.
  • ru Итоги года в PHP мире — Опрос сообщества Skyeng и PHP Digest. Последняя неделя, чтобы принять участие.

PHP Internals


  • [RFC] Object keys in arrays
    Никита предлагает сделать возможным использование объектов в качестве ключей обычных массивов.

    $obj1 = new stdClass;
    $obj2 = new stdClass;
    
    $array = [];
    $array[$obj1] = 1;
    $array[$obj2] = 2;
    
    var_dump($array[$obj1]); // int(1)
    var_dump($array[$obj2]); // int(2)
    

    Сейчас для этого можно использовать SplObjectStorage или WeakMap, и они будут вести себя как массивы. Но все равно останутся ограничения. Например, их нельзя использовать в функциях array_* и многих других стандартных.

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

    Поводом для предложения послужил тот факт, что в RFC Enumerations предлагается сделать значения енамов объектами. И соответственно тогда их нельзя будет использовать в качестве ключей массивов. А это существенный минус.
  • [RFC] Object scoped RNG Implementations
    Функции для генерации псевдослучайных чисел rand() или mt_rand() будут генерировать одну и ту же последовательность для одинакового посевного (seed) значения srand(). Но из-за использования глобального состояния невозможно создать несколько генераторов с разными посевными значениями и использовать их одновременно.

    Автор предлагает добавить объектный API для работы с генераторами псевдослучайных последовательностей, чтоб решить проблему глобального состояния.
    $seed = 1234;
    $rng = new RNG\MT19937($seed);
    $array = [1, 2, 3, 4, 5];
    
    shuffle($array, $rng); // Результат всегда стабильный
    
    Если нужны криптографически стойкие случайные числа, то есть, которые устойчивы к атакам, то следует использовать: random_bytes() или random_int().
  • [RFC] var_representation(): readable alternative to var_export()
    Функция var_export(), которая выводит набор выражений в строку, давно была предметом жалоб. Как минимум был RFC с предложением сменить синтаксис массива с array( ) на [ ].

    Теперь же предлагается просто ввести новую функцию var_representation($value, int $flags=0) :string, которая исправит все недостатки var_export().

    В качестве альтернативы пока можно использовать brick/varexporter.
  • [RFC] Change Default mysqli Error Mode
    В рамках инициативы по улучшению расширения mysqli (подробнее было в PHPLive#3 ) предлагается первый шаг: сделать режим бросания исключений в случае ошибки дефолтным. То есть это как если сейчас в приложении добавить вызов: mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

    Из крупного опенсорса mysqli используют только CodeIgniter и WordPress.
  • [RFC] Dump results of expressions in `php -a` — На голосовании предложение по улучшению интерактивного шелла php -a.
  • PHP 8.1: What's New and Changed — На php.watch можно следить за тем, как будет выглядеть PHP 8.1. На сайте собраны все принятые RFC и важные пул-реквесты с описаниями.

Инструменты


  • fabpot/local-php-security-checker — Проверяет composer.json на предмет наличия зависимостей с известными уязвимостями. В качестве базы уязвимостей используется FriendsOfPHP/security-advisories.

    Можно использовать готовый GitHub action или Docker-образы от oxcom.
  • funivan/PhpClean — Плагин для PhpStorm, который добавляет пачку интересных инспекций, например, чтоб везде были объявлены типы, не было лишних комментариев, и использовалась композиция вместо наследования. Отличный пост в поддержку.
  • wasmerio/wasmer-php — WebAssembly рантайм для PHP. Расширение позволяет запустить и использовать любой wasm-бинарник из PHP. То есть можно взять библиотеку на Rust, скомпилировать в wasm и использовать на любой платформе из PHP. При этом с очень высокой производительностью. Подробнее в посте автора.
  • temporalio/sdk-php — Антон Титов и Кирилл Несмеянов готовят PHP-SDK для temporal.io – распределенный, масштабируемый, отказоустойчивым, высокодоступный движок, для выполнения процессов бизнес-логики.

    Пример реализации накопительной транзакции т.е. перевести деньги продавцу от нескольких покупателей в течении какого-то периода времени:
    Скрытый текст
    #[Workflow\WorkflowInterface]
    class LoopWorkflow
    {
        private array $values = [];
        private array $result = [];
        private $simple;
    
        public function __construct()
        {
            $this->simple = Workflow::newActivityStub(
                SimpleActivity::class,
                ActivityOptions::new()->withStartToCloseTimeout(5)
            );
        }
    
        #[SignalMethod]
        public function addValue(
            string $value
        ) {
            $this->values[] = $value;
        }
    
        #[WorkflowMethod(name: 'LoopWorkflow')]
        public function run(
            int $count
        ) {
            while (true) {
                yield Workflow::await(fn() => $this->values !== []);
                $value = array_shift($this->values);
    
                $this->result[] = yield $this->simple->echo($value);
    
                if (count($this->result) === $count) {
                    break;
                }
            }
    
            return $this->result;
        }
    }

    Под капотом RoadRunner, reactphp/promise, атрибуты PHP 8. Подробнее на стриме расскажет сам автор, Антон Титов.

Symfony


  • chaos-php/chaos-monkey-symfony-bundle — Chaos Monkey для Symfony-приложений. Пытается делать всякие экстремальные ситуации, чтобы проверить приложение на устойчивость.
  • habr Новое в Symfony: инициатива UX — новая экосистема JavaScript для Symfony
  • habr Новое в Symfony 5.2: атрибуты PHP 8
  • Неделя Symfony #734 (18-24 июня 2021)

Laravel


  • umbrellio/laravel-pg-extensions — Расширяем возможности миграций Laravel за счет Postgres.
  • fico7489/laravel-eloquent-join — Немного улучшений для джоинов в Eloquent.
  • artisan.page — Шпаргалка по Laravel artisan.
  • video Мульдоменное / multitenant приложение на Laravel и Jetstream — без дополнительных пакетов.
  • ru Непрерывная интеграция для Laravel с помощью Github Actions
  • ru 18 советов по оптимизации запросов к базе данных
  • habr Laravel–Дайджест (18–24 января 2021)

Yii


  • Пара обновленных компонентов: yiisoft/i18n 1.0, yiisoft/auth 2.0.

Async PHP


  • walkor/Workerman — Асинхронный движок с простым API, поддержкой HTTP, WebSocket, SSL. Может работать в связке с libevent.

    Самый быстрый фреймворк на PHP в бенчмарках the-benchmarker/web-frameworks, в частности, потому что умеет из коробки стартовать пачку воркеров.

    Также на его базе есть реализация socket.io сервера walkor/phpsocket.io, адаптер PSR-7,15,17 chubbyphp/chubbyphp-workerman-request-handler, и фреймворк gotzmann/comet.

Статьи


  • Коллизии PHP массивов — Интересный пост о том, как можно использовать тот факт, что массивы в PHP – это хэш-таблицы, для организации DoS-атаки.

    Никита в 2011 году уже писал, как вставка 2^16 = 65536 значений в PHP массив может занимать 30 секунд вместо ожидаемой 0.01 секунды.
  • php.watch: PHP Curl Security Hardening — В статье показаны потенциально небезопасные места при использовании cURL в PHP и как защититься.
  • Пишем Telegram-бота на PHP — и тестируем локально с помощью beyondcode/expose.
  • Делаем динамический профиль на GitHub с помощью GitHub Actions и PHP.
  • habr Двоичные и побитовые операции в PHP.
  • habr Трассировка и логирование в микросервисах: как мы втаскивали единый стандарт на 30 независимых команд.
  • habr Интеграция PHP проекта на GitHub и Scrutinizer.
  • habr Автоматизация ручных действий с GitHub Actions.

Аудио/Видео


  • video Xdebug 3: Diagnostics — Что делать, когда Xdebug почему-то не работает.
  • video Как использовать терминал в PhpStorm — Кстати, автор видео Christoph Rumpel запустил платный курс по PhpStorm: Mastering PhpStorm.
  • video Live-coding a Bref Queue — Летсплей о создании отложенных задач на PHP в серверелесс-окружении. От Matthieu Napoli, автора Bref.
  • video PHP Release Radar #2: PHP 8 — С Sara Golemon и Gabriel Caruso про 8.0, основы расширения PHP и о различных способах участия в проекте.

Сообщество


  • habr Это не легаси-код, это PHP.
  • Буря в стакане по поводу PHP 8 — В декабре был пост от @jrf_nl, в котором автор жаловалась, что в PHP 8 слишком много обратно несовместимых изменений и обновиться очень сложно.
    Эту идею подхватил и Зеев Сураски, который играл одну из ключевых ролей в развитии PHP в период 1997-2017.


    В ответ Brent Roose написал свой пост и разложил, почему проблема преувеличена, а обновляться не страшно и лучше делать это регулярно.

    Хотя доля правды в словах Зеева и других есть. Потому что иногда миграция может быть неочевидной. Например, вот такой код никогда не вызывал ни ошибок ни депрекейшн ноутисов, а в PHP 8.0 отвалится с TypeError:

    var_dump(round("foo"));
    3v4l.org/pU0LD

    Или вот еще неочевидный, хоть и задокументированный, пример из слайдов:
    $sub = substr('abcdef', 4, -4);
    if ($sub === false) {
        echo 'fail';
    } else {
        echo 'do something with $sub';
    }
    
    // PHP 5-7 > 'fail'
    // PHP 8   > 'do something with $sub'
    
    3v4l.org/Ln9g3

    В тему хороший ресурс по обновлению и поддержке легаси кода: understandlegacycode.com.
  • Как выглядел бы PHP, если бы это зависело от меня — Подборка желанных фич от Brent Roose: final и void по умолчанию, никакого mixed, параметры и свойства обязательно типизированные, дженерики, куда ж без них, енамы, объекты для скаляров.





Сегодня будет четвертый стрим по мотивам PHP Дайджеста. Разбор новостей и ссылок из выпуска с подробностями и интересными деталями, не вошедшими в текстовый выпуск. В гостях Антон Титов с рассказом про новый инструмент. А также результаты розыгрыша и новый конкурс со слониками.
Начало в 20:00 Москва, Минск / 19:00 Киев.



Если вы заметили ошибку или неточность — сообщите, пожалуйста, в личку хабра или телеграм.

Больше новостей и комментариев в Telegram-канале PHP Digest.

Прислать ссылку
Поиск ссылок по всем дайджестам
← Предыдущий выпуск: PHP-Дайджест № 196
Источник: https://habr.com/ru/post/539034/


Интересные статьи

Интересные статьи

Привет! Завершаем год традиционным дайджестом «классических» и нетривиальных ИБ-инцидентов, о которых писали зарубежные и российские СМИ в декабре. Нас лично впечатлило, ...
Что нового в Laravel 8. Руководство по обновлению до новой версии. Laravel Jetstream. Пакетирование задач. Набор компонентов для Blade-шаблонов. Читать дальше → ...
Предлагаем вашему вниманию подборку с ссылками на новые материалы из области фронтенда и около него. Читать дальше →
Свежая подборка со ссылками на новости и материалы. В выпуске: PHPUnit 9 и другие релизы, 3 свежих RFC предложения из PHP Internals, порция полезных инструментов, видео, подкасты и многое друго...
Предлагаем вашему вниманию подборку с ссылками на новые материалы из области фронтенда и около него.