Скачать mp3 / Весь mp3-архив

PHP подкаст #2

Важное замечание! В подкасте я сказал, что EventDispatcher компонент реализует Oberserver паттерн. Это не так. EventDispatcher компонент реализует Mediator паттерн.

План выпуска:

Павел Савельев из Lamoda об опыте внедрения Silex/Symfony

Прелюдия о размере компании. 3500+ сотрудников и 7 этажей в здании. Что-то вроде этого. ZF2 + Silex для менеджмента тикетов и работы call-центра. Другой компонент также на ZF2 + Silex позволяет организовать эффективную доставку. Студия на ZF2. Doctrine и Monolog были отмечены в стеке. Холивар Angular vs React.

Ильяс Салихов из RetailCRM о построение SaaS-сервисов

Ильяс рассказал о достаточно частных проблемах и решениях. Больше про БД и DevOps как мне показалось.

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

Было решено сделать один контейнер с динамическими параметрами, т.е. добавить возможность в конструктор контейнера передавать аргументы. Было рассказано как собирается сам контейнер.

Вторая проблема, с которой они столкнулись: шардинг и распределение баз по серверам.

Был упомянут pgbouncer — это прокси к PostgreSQL, которых “держит” соединение. Ильяс упомнянул, что время запросов сократилось в 2-10 раз.

В результате стали упираться в максимальное количество одновременных соединений (max connection) и решили разбить базы по схемам. Не лучший подход, т.к. планировщик выполнения запроса анализирует в PostgreSQL все таблицы всех схем. Решили на одном сервере запускать несколько БД, с ограниченным количеством схем.

Долго происходят миграции, поэтому доработали механизм деплоя.

Не хватило в обзоре архитектурной картинки и стека.

Алексей Медведев из Alpari: Symfony Workflow компонент

Я уже успел попользоваться этим компонентом и вполне им доволен. Что такое Workflow и что такое система управления Workflow? Были упомянуты сети Петри — двудольный ориентированный мультиграф. Вершины, ребра, токены. Workflow-сеть — частный случай сети Петри. В Symfony Workflow вы можете с помощью YAML сконфигурировать граф. Я это делал в своей небольшой задаче вручную. Состояние субъекта определяется сущностью, т.е. значениями аттрибутов этой сущности.

Алексей рассказал об особенностях их WorkflowExtensionsBundle. Особенности: шедулинг (отложенное выполнение transition’a), блокировка переходов с помощью ExpressionLanguage.

Шедулинг реализуется бандлом JMSJobQueueBundle.

Руслан Ханов из Яндекса о Symfony как о микрофреймворке.

Symfony используется в Яндексе. В яндекс доставке. Не знал до этого о существовании такого сервиса. Исторический обзор того как жили при symfony1. Насколько я помню, что название фреймворка писалось с маленькой буквы. Руслан концептуально сравнил микро и макро фреймворки. MicroKernel не нужен!

Марко Пиветта (Ocramius) о проектах с большим горизонтом существования

Замечательный доклад. Марко работает в консалтинговой компании и знает о чем говорит :). Доклад может быть особо полезен для тех, кто пишет публичный код. Абстрактный и о лучших практиках проектирования софта.

Defencive coding по аналогии с defencive driving, т.е. вождением, когда вы допускаете, что другие участники дорожного движения также могут ошибаться. Нужно писать софт так, чтобы те, кто ошибаются понимали в чем их ошибка и делать софт работоспособным даже при условии ошибок пользователя.

Poka Yoke: IKEA, RJ45, not USB.

Code is not reusable, but abstraction (interfaces). Code is crap.

Should know: SOLID, object calisthenics, PSR-7

Immutable state: на практике не использовать set-методы, сокращать количество public-методов (требуют вечной поддержки), убирать bool-флаги из аргументов методов (разбивать методы именованием), состояние должно менеджерится классом, а не его пользователем.

Избегать в коде предположений — это источник багов. Стремиться гарантировать идемпотентность.

Немного необходимой паранои: https://github.com/beberlei/assert. Везде проверять значения переменных, где есть сомнения.

Использовать Value-объекты. Если возникает ситуация, когда метод принимает mixed: bool, null, int, то нужен value-объект, класс которого менеджерит логику значений. Также не возвращать mixed-тип как результат метода.

Как можно больше final-классов. Не использовать traits (code is crap). Избегать клонирования и сериализации.

Не доверять чужому коду: делать как можно больше код-ревью. И стремиться к минимуму фич, т.е. что-то вроде KISS-принципа в Linux.

Опять Марко о лучших практиках в Doctrine2

Этот доклад я уже видел на другой конференции с небольшими изменениями. Важно понимать для чего Doctrine не предназначена:

DDS; отчеты. Референс к EventSourcing’у — immutable данные. Стремиться к неизменяемым данным. Это упрощает механизмы кеширования и делает предсказуемым рост данных. Также возможен анализ истории.

Бизнес логика. Избегать повсеместной нормализации.

Алексей Петров о масштабировании

Веселый бодрый доклад про масштабирование. Yandex Tank 100K запросов. Основная идея — избегать шардинга БД. Лучше шарить по микросервисам.

Дмитрий Науменко (Yii core team) о профилировании

XDebug ведет к двойному понижению производительности, поэтому его профайлер вобщем не применим.

XHProf понижает производительность не более 10%. Под PHP7 работают только его форки:

Blackfire. У них есть бесплатный ТП, поэтому попробовать надо!

Александр Махомет. Тимлид upwork’а о том как поддерживать веб-сервис

“Репутация зарабатывается долго, а теряется быстро” — это пожалуй идея доклада.

DevOps культура: разработчики и админы — члены одной команды. Автоматические инструменты деплоя.

Эффективно отлавливать ошибки на проде. PSR-3. Писать больше логов: реквсты (реквест id). ELK-стек (json) для логирования.

Мониторинг количества ошибок: Graphite, Google Analytics.

Собирать статистику по времени выполнения запросов. 99 перцентиль времени генерации страниц, чтобы исключить аномальные значения для оставшегося 1% пользователей.

Graphite для временных рядов. Carbon (agent), Whisper (DB), Graphite-web. Хорошо добавить в стек StatsD. Он работает по UDP, т.е. неблокирующим образом.

Последние два инструмента были продемонстрированы. Стрим закончился посредине доклада. Остается только догадываться чем там все закончилось.

Сергей Протько о связанности в коде

Баланс между внетренней и внешней связанностью. Single Responsibility принцип. Нужно много качественного нейминга.

Снижать зависимости введением интерфейсов к стороннему коду.

Был упомянут и объяснен закон Деметры. Такие вещи всегда полезно повторить.

Опять же минимум public-методов.

Инкапсуляция. Название методов должно отражать цель метода.

https://github.com/mamuz/PhpDependencyAnalysis для графической репрезентации зависимостей.

Рекомендуемые книги:

Ростислав Михайлов о Zend Framework 3

Теперь ZF3 больше похож на Symfony — это конгломерат компонентов, которые можно использовать и по отдельности. Убрали локатор сервисов и теперь зависимости нужно инжектить явно. Большее следование PSR-7. Предложен пайп-компонент. С ним желательно варить JWT (JSON Web Token), чтобы избежать проблем с сессиями.

Переработан EventManager. Zend Expressive — мета-фреймворк.

Библиотека для красивого дампа ошибок: https://github.com/filp/whoops

Оливер Дольбу и Бенджамин Де Бернарди о BlaBlaCar и масштабировании проекта на Symfony

25M+ клиентов. До использования фреймворков они писали проект на plain-PHP и без тестов. Далее мигрировали на Symfony. Докладчики рассказали банальные вещи про EventDispatcher: как он работает и как они его варят на большом проекте. Все возможные события они сделали асинхронными, пропуская их через RabbitMQ. Для забора сообщений из очереди используют https://github.com/swarrot/swarrot, которую мейнтейнит один из их кор-девелоперов.

Вторая часть доклада была о разных вещах, которые будут болью. Doctrine2, которая хороша по мнению докладчика только для маленьких проектов. О вреде монолитных приложений. Стараться снизить связность компонентов проекта. Создавать свои маленькие независимые компоненты. Рассказали о том, что они пишут документацию — осознали её необходимость с ростом проекта.

Все тесты у них прогоняются за 20 минут. У них 5 или 6 выделенных серверов для тестирования. 30 минут занимает деплой. Используют Docker.

Игорь Карпенко: DCI

Data, Context, Interaction. Используемые технологии:

Дополнительно:

Андрес Гутьеррес Phalcon 3.0

История развития фреймворка. Бенчмарки. Выход новой версии Phalcon: LTS, поддержка PHP7.

Опубликовано: 16.09.2016
Теги: Alpari, best practices, BlaBlaCar, DCI, DevOps, Doctrine2, ELK, Graphite, JWT, KISS, Lamoda, pgbouncer, Phalcon, PHP frameworks day, PHP7, Poka Yoke, PSR-7, RabbitMQ, RetailCRM, SaaS, Silex, SOLID, Symfony, Symfony Moscow Meetup, Symfony Workflow, upwork, YAGNI, ZF2, ZF3, Александр Махомет, Алексей Медведев, Андрес Гутьеррес, Бенджамин Де Бернарди, закон Деметры, Ильяс Салихов, Марко Пиветта, масштабирование, Окрамиус, Оливер Дольбу, Павел Савельев, Ростислав Михайлов, связный код, Сергей Протько, шардинг