PHP подкаст #14

Скачать mp3 (55Мб)

Краткая серия статей (перевод от Mail.ru Group) об оптимизациях в PHP7 от Джульена Паули. Blackfire взят в качестве профилировщика. Первое, о чем стоит упомянуть — это оптимизированные массивы. Избегая ассоциативных массивов в угоду обычным — где индексом является число -, а также сортируя ключи массива по возрастанию можно достичь существенного (до 10 раз) повышения производительности. Другая приятная особенность — экономия памяти, которую многие уже заметили. Дело в том, что в 7 версии переиспользуются контейнеры переменных. Единожды выделенная память для переменной может быть повторно использована. Также улучшена работа с encapsed-строками (строки в двойных кавычках/Heredoc): вместо последовательного довыделения буфера происходит его единовременная аллокация. Также существенно улучшена работа со статическими массивами. Теперь интерпретатор различает изменяемые и неизменяемые/immutable массивы (часть OPCache расширения), поэтому сейчас можно не переживать по поводу разных map-массивов. Также существенно улучшена работа со ссылками. В ранних версиях преобразование переменной в ссылку приводило к полному копированию содержимого переменной, поэтому оптимизации как в C/C++ не получалось. В новой версии дополнительных аллокаций памяти не случается в случае преобразования не ссылочной переменной в ссылку. Для погружения в детали лучше прочесть статью от Никиты Попова.

В преддверии выхода Laravel 5.4 Тейлор Отвел поделился бенчмарком от blackfire. Hello world приложение с одним дефолтным маршрутом: 8мс, 1.8Мб RAM, 622 rps (mean).

У Laravel (5.3) Collections появился метод partition, который позволяет быстро разбить массив по некоторому признаку. Работа с коллекциями через collect в Laravel организована удобно: код становится значительно более читаемым, если вы используете map/reduce/другие методы, вместо array_map/array_reduce.

Примечательная статья об использовании Transient паттерна. Вся история вокруг Money типа, который захотелось сделать immutable. Незадача в том, что менеджерский абстрактный класс часто создает “ненужные” временные объекты типа Money. Это повышает требования к RAM. Автором был предложен паттерн Transient, который налагает на разработчика заботу о разделении режима mutable/immutable в сущностном классе. Хотите добавить несколько долларов к существующему объекту типа Money? Не проблема: вместо создания промежуточных объектов, мы можем мутировать текущий, но в определенном mutable-контексте, задаваемом единственным вспомогательным методом (вынесен в trait) withMutable(callable $fn). Функция $fn вызывается в mutable-контексте, задаваемом флагом mutable. Из недостатков — нужно переместить логику из абстрактного класса, который менеджерит манипуляцию immutable сущностями в сами сущности и писать по два обработчика: на случай mutable == true и mutable == false. Мутабельность становится контролируемой и в итоге все равно возвращает immutable объекты при снижении промежуточного инстанцирования. Читать далее PHP подкаст #14

PHP подкаст #13

Command паттерн, HAL для API, Varnish и Си спешит на помощь.

Скачать mp3 (27Мб)

Command паттерн используется для абстрагирования от технических деталей в пользу бизнес логики. Команду можно формировать из HTTP запроса, введенных данных в CLI и т.д. Команда содержит все необходимые данные для её обработки. Command Bus паттерн также способствует упрощению кода путем инкапсуляции:

  • Бизнес-логика перемещается в специальные хэндлеры и становится независимой от фреймворка (разлепляемся с реквестом, например).
  • Тонкий контроллер.
  • Упрощается тестирование.
  • Меньше дублирования кода.
  • Пространство для маневра за счет middleware (Decoration / Chain of responsibility).
  • Восстановление состояния системы за счет выполнения залогированных ранее команд.

Использование Command Bus особенно удобно в присутствии Service Layer, что предполагает скорее крупное приложение, чем небольшое. Часто — но не обязательно — мы говорим о Command Bus в контексте CQRS. Другим преимуществом Command Bus является разделение вызова и обработчика, что способствует последующему масштабированию — обработчик команды можно вынести за периметр приложения. Этот паттерн в некотором смысле также гарантирует перетекание ненужных зависимостей от фреймворка в бизнес-логику.

Реализаций командных шин предостаточно. Самые популярные:

Команда (Command) — это как правило объект с публичным атрибутами, своеобразный DTO. Здесь гармонично смотрятся get/set-методы. В командный объект целесообразно, например, мэпить реквест посредством форм-компонента или путем десериализации. Читать далее PHP подкаст #13

PHP подкаст #12

JIT в PHP8, JWT для SSO, кривые оптимизации Zend VM, рамбл ток о фрилансе.

Скачать mp3 (33Мб)

Еще немного про производительность интерпретатора PHP.  Уже гоняют бэнчмарки на экспериментальной ветке https://github.com/zendtech/php-src. 7ая версия стала прорывом в нескольких смыслах. 7.1 несколько быстрее 7 за счет оптимизации opcache расширения. А JIT/PHP8 потенциально еще удвоит производительность интерпретатора. Лучше один раз увидеть результаты бэнчмарка. Надеюсь, что в PHP8 добавят pthread как core extension.

На недавней Symfony-конфереции Фабьен Потенсье анонсировал грядущий выход нового продукта Symfony Flex. Что-то вроде “Make Symfony Great Again”. На реддите есть коротенький тред, в котором один из участников объяснил свое понимание Flex: обертка вокруг composer, упрощающая менеджмент бандлов/зависимостей. Посмотрим, что за зверь. Обещают релиз на начало 2017, т.е. ждать осталось недолго.

Только вышла Symfony 3.2, но это не означает, что цикл разработки фреймворка остановился и в 3.3 — выйдет в конце мая 2017 — в Security компонент добавлена JSON-аутентификация. Вместо привычной формы с логином и паролем мы должны отправить POST-запрос на определенный конфигом endpoint с JSON’ом на борту. В этом JSON должна быть указана пара login/password. Это нововведение упростит реализацию JWT-решений и может пригодиться для SSO. В ответ на такой JSON может прийти JWT, передаваемый серверу при каждом реквесте в заголовке.

Выложили два видео с прошедшего митапа комьюнити ThinkPHP. Тарас Омельяненко выступил с докладом по их подходам к разработке большого приложения на PHP. В большей степени доклад посвящен циклу разработки и сопутствующим ему инструментам: Swagger, git (flow), Jenkins CI, Docker, Ansible, балансировка нагрузки и т.д. Одна мысль показалась наиболее ценной — предложить клиенту комплексное решение, в котором уже есть все от документации и спецификаций API до CI. На первых порах это может быть реализовано просто, но вы задаете тон последующей разработке. С определенного момента по другому уже делать продукт не получается. Читать далее PHP подкаст #12