Выпуск №23 — чат-боты Радио-Т

Бот «Пятиминутка PHP» для чата подкаста Радио-Т расскажет интересные и познавательные факты из мира PHP разработки.

Привет мир!
Вы слушаете «Пятиминутку PHP», выпуск номер 23 — подкаст о новостях из мира PHP, интересных постах в блогах и современных подходах к разработке.

В подкасте Радио-Т, который, пожалуй, является самым популярным русскоязычным IT подкастом, есть Gitter чат. Основная активность в этом чате, соответственно, происходит во время онлайн вещания. Недавно, umputun (главный ведущий) пригласил всех желающих поучаствовать в написании ботов для этого чата. Задача звучит следующим образом: нужно написать бота как микросервис, который получает все сообщения из и отвечает на некоторые по своему усмотрению. Микросервис обязательно упаковать в docker контейнер, а язык программирования — любой.

Идеи для полезных и забавных ботов:
— ведение псевдо-разумной дискуссии по варианту сири/алексы/гугла;
— ответы над узкие вопросы, типа «какая погода в Москве сегодня»;
— функции поиска по подкасту (шоунотам и логам);
— все остальное, что можете придумать.

Я подумал, и решил написать бота Пятиминутка PHP! Расскажу о нём подробнее чуть позже, а пока немного про других ботов.

Всё поделки отправляются в монорепозиторий на GitHub umputun/rt-bot по средствам пулл-реквестов. Я посмотрел на присланных, почитал исходники на разных языках реализующих похожую задачу и это оказалось весьма интересно и познавательно. Что делают боты? Например, есть бот который реализует clojure repl, т.е. командную строку для выполнения кода на языке clojure; есть бот, который при упоминании Гвидо (автора языка Python) постит его фотографию; другой постит гифки с сайта developerslife.ru. Кстати, если раньше не видели гифки с сайта developerslife.ru — обязательно зайдите и посмотрите!

На мой глаз приятнее всего ложатся исходники на Python и Clojure — компактно, понятно, всё рядом. Самая жесть в ботах на Java и C# — много файлов, много вложенных директорий, отдельных классов и интерфейсов.

На момент записи подкаста в репозитории находилось 15 ботов: 4 на Python, 3 на Go, 2 на Java, по одному на Perl, JavaScript, TypeScript, C#, Clojure и мой на PHP. Был ещё бот на Haskell, но после 15 минут ожидания компиляции, umputun устал и не стал его запускать.

Я смотрел логи сборки всех ботов в Travis’е: Java проекты скачивают и устанавливают сотни пакетов из Maven Central и боты на этом языке заметно дольше собираются и стартуют, по сравнению с остальными. Боты на Node.js тянут и устанавливают тысячи пакетов (но мелких). Для контраста бот «Пятиминутка PHP» состоит всего из одного файла index.php, который копируется из репозитория в docker контейнер всего одной командой!

Если отвлечься от темы ботов, то вообще говоря, про язык PHP существует много заблуждений. Однажды один разработчик спросил у меня: «а в PHP классы вообще есть?». Слышал также мнения, что ООП в PHP в зачаточном виде без privat и protected (а-ля Python или классы из ES2015). Встречал утверждения, что сайты на PHP тормозят, т.к. он однопоточный, поэтому пока обрабатывается запрос от одного клиента, другие ждут в очереди. И конечно, каждый второй уверен, что PHP не умеет работать с Unicode строками, а запросы к базе в перемешку с выводом в шаблонах — это типовой PHP-подход.

Итак, я решил запустить образовательно-познавательного бота «Пятиминутка PHP», чтобы продвинутая аудитория подкаста Радио-Т перестала верить в мифы о PHP из середины 2000-х годов. Каждый раз, когда в чате упоминается PHP, бот рассказывает какой-нибудь факт о современных подходах к разработке в экосистеме PHP. Базу знаний я веду в специальном текстовом файле на github и дополняю её, как только приходят хорошие мысли. Присоединяйтесь и вы! Внести пару предложений в текстовый файл может каждый, для этого даже не придётся клонировать git репозиторий, ведь можно редактировать прямо через веб-интерфейс гитхаба! Ссылка в описании подкаста.

Вот несколько позитивных фактов о PHP, которые я записал:

  • Помимо развитого ООП в PHP поддерживаются Трейты (trait), они же примеси или миксины
  • На PHP можно писать и в функциональном стиле, есть функции высшего порядка, замыкания, map/filter/reduce, и даже книга с описанием продвинутых техник (аппликативы, функторы, монады): «Functional Programming in PHP»
  • В PHP есть генераторы (ключевое слово yield) и библиотеки реализующие кооперативную многозадачность (корутины)
  • Каждый запрос в PHP начинается с чистого листа. Начиная каждый запрос с известного состояния, мы получаем своего рода изоляцию от возможных ошибок; если запрос t сталкивается с неполадкой и завершается с ошибкой, данный баг не оказывает никакого влияния на выполнение последующего запроса t+1
  • Отдельно взятый запрос обрабатывается однопоточно, но PHP-FPM (FastCGI Process Manager) сам запустит столько воркеров, сколько нужно (в сконфигурированных рамках) для параллельно обработки
  • Работа с файлами, сетью, юникодом, большими числами т.д. (стандартная библиотека) — это тонкая прослойка к Си библиотекам, что работает очень быстро
  • PHP — язык с динамической типизацией, но вы можете описать типы у аргументов функций и указать типы возвращаемых значений (включая примитивные типы, интерфейсы и классы), тем самым получив все преимущества статически-типизированных языков. В добавок, если указать конструкцию declare(strict_types=1), типизация станет ещё и сильной (без приведения int -> float и т.п.)!
  • Существует заблуждение, что на каждый запрос PHP заново интерпретирует весь код. На самом деле при первом обращении исходники компилируются в байт-код, который сохраняется в памяти OPcache. При последующих обращениях используется уже закешированный байт-код. По умолчанию проверка исходников на наличие новых происходит не чаще чем раз в 2 секунды, но эту проверку можно вообще отключить и всегда использовать скомпилированный и закешированный байт-код.
  • Не подумайте, что PHP используется только для простых сайтов и блогов. На PHP пишут и большие enterprise и e-commerce системы с использованием CQRS и DDD. При этом скорость разработки и включения новых разработчиков в проект очень высока
  • Для PHP существует отличный менеджер пакетов Composer с центральным репозиторием, управлением версиями и зависимостями
  • Backend сервисы Slack написаны на PHP и команда считает, что это правильный выбор, чем они и поделились в своём блоге
  • Сайт крупнейшей фриланс биржи Upwork также написан на PHP
  • Сайт белого дома США whitehouse.gov работает на Drupal — CMS на PHP. Все наработки команда выкладывает на GitHub
  • Можно насчитать более двух десятков подкастов о PHP, многие из которых выходят регулярно, посмотрите на сайт агрегатор phppodcasts.com

И так далее.

Присоединяйтесь, пулл-реквесты принимаются, ведь PHP это не только фрактал плохого дизайна!

P.S. в официальном чате Радио-Т боты пока не запущены, сейчас они работают в рамках тестового чата: https://gitter.im/umputun/test

  • Alma Z

    Может в следующем подкасте рассмотрите шаблоны проектирование на ПХП?

    Или рассмотрите вопрос:
    Что лучше, наследование или композиция на примере ПХП?

    • Наследование vs Композиция — хорошая тема! Спасибо за наводку.

  • Lebnik

    Поздравляю, твой бот и имя засветились в радио-т 🙂

    • Да, и удачно с названием вышло — первый по алфавиту среди других ботов 🙂