Как работает OPcache?

Один из основных на сегодняшний день разработчиков PHP Никита Попов рассказал в своём блоге некоторые детали работы OPcache.

OPcahce — это расширение для PHP, которое ускоряет работу за счёт кэширования опкодов.

В этом выпуске подкаста Пятиминутка PHP сделаю краткий пересказ, поробую объяснить своими словами.

https://www.npopov.com/2021/10/13/How-opcache-works.html

YaTalks, Yii3, Tinkerwell, Mac mini M1…

Поговорим на несколько разных тем: подкаст и конференция YaTalks, первые впечатления от Yii3, PHP 8.1 уже близко, Tinkerwell, Mac mini на M1, механические клавиатуры и коврик для мыши с JSON API.

Разработка больших проектов на Битрикс

Второй подкаст в серии про Битрикс. Иван Поддубный из компании Вебпрактик рассказывает про свой опыт разработки крупных проектов на Битрикс и сравнивает с другими фреймворками и стеками технологий.

  • Что используется в Вебпрактик: Битрикс, Laravel, NodeJS
  • Почему 80% проектов на Битрикс, почему?
  • Кто типовой заказчик?
  • Как Битрикс выиграл рынок заказной разработки крупных проектов?
  • Почему страдают крупные заказчики поставившие на .NET и Ruby?
  • Есть ли у Битрикс преимущество по скорости разработки и в удобсте поддержки?
  • На сколько велика разница в подходах к кодированию между Битрикс и Laravel? Роутер? Контроллеры? Модели? ORM? API?
  • Подход по скрещиванию Laravel с Битрикс в одном проекте, в одной кодовой базе
  • Почему от этого подхода решили отказаться?
  • Какие готовые решения по бизенс-логике даёт Битрикс?
  • Админка Битрикс — хороша или нет?
  • В админке так много функций, что есть целые обучающие видеокурсы для администратора, для контент-менеджера и проч.
  • Инициатива в Drupal по переписыванию админки на React
  • Ограничения, которые накладывает Битрикс. Часто ли упираешься в архитектуру Битрикса?
  • Производительность Битрикса
  • Что делать с номенклатурой в несколько сотенд тысяч позиций и таким же количеством свойств?
  • Микросервисы на NodeJS вокруг Битрикс монолита
  • Отказ от PHP шаблонов в пользу React и SPA
  • Кадровый вопрос поиска фронтенд разработчика
  • Тренд на SPA?
  • Битрикс управление сайтом vs Битрикс24
  • Процесс деплоя Битрикс
  • Поставка Битрикс проектов с помощью Docker в Kubernetes
  • Реверс-инженеринг миграций ядра
  • Поддержка со стороны компании 1С-Битрикс
  • Темпы развития ядра
  • Взгляд на развитие Битрикса со стороны внедрения
  • Важность обратной совместимости, антипримеры перехода с Magento 1 на Magento 2, переписывание Drupal, ModX Evolution vs Revolution, Python 2 vs Python 3.
  • Top 3 проблем Битрикс: дистрибьюция (composer?), встроенный механизм миграций, полноценный DI по всему ядру

Ссылки по теме:

Ядро Битрикс — история и планы

Для этого выпуска подкаста я пригласил двух разработчиков ядра Битрикс: Дмитрия Медведева и Ивана Челищева. Обсудили историю развития Битрикс, что такое ядро и Bitrix Framework, что такое D7, как выглядит разработка под Битрикс сейчас и какие планы на будущее.

Темы выпуска:

  • Краткая справка про компанию 1С-Битрикс
  • Какие версии PHP поддерживаются?
  • Обратная совместимость
  • На сколько Bitrix Framework похож на другие PHP фреймворки?
  • Переписывание фреймворка «с нуля» в начале 2010-х
  • Гибридное ядро для поддержания обратной совместимости
  • Битрикс Управление Сайтом vs Битрикс24 — общее ядро внутри?
  • Кто заказчик для команды разработки ядра?
  • Секретный чат тимлидов разработчиков на Битрикс
  • Можно ли использовать Bitrix Framework отдельно от продуктов 1С-Битрикс?

Про технологии в актуальной версии D7:

  • Используются суперглобальные массивы $_GET, $_POST?
  • ORM, QueryBuilder и работа с базой
  • Active Record или Data Mapper?
  • Почему не Doctrine?
  • Миграции и система обновлений
  • Поддержка различных СУБД?
  • Почему нет PostgreSQL?
  • Роутинг и точки входа
  • Шаблонизация, защита от XSS, подключение внешних шаблонов
  • Работа с очередями, агенты
  • IoC контейнер или Service Locator?
  • Autowiring в контроллере
  • Консольные команды на основе symfony/console
  • Другие внешние библиотеки
  • Используется ли composer?
  • Код в публичной директории?
  • Сборка PHP кода
  • Сборка фронтенд кода: инструмент Bitrix CLI на основе Rollup
  • На сколько код в целом выглядит современно?
  • PhpStorm и плагины

Что планируется в будущем Bitrix Framework 3?

  • концептуальный прототип
  • переработанный жизненный цикл
  • Twig с CMS-ориентированными плагинами
  • пока не публично
  • сбор обратной связи от разработчиков
  • переход должен быть плавным
  • почему бы не взять Symfony или Laravel и писать поверх?
  • ориентация на PSR
  • сложность по интеграции со старым API и поддержки совместимости
  • сколько ресурсов выделено на разработку Bitrix Framework 3?
  • как организована командная разработка внутри компании 1С-Битрикс?

В завершение:

  • На Битрикс24 используется не только PHP, но и Node.js и другие технологии
  • Модель гибридного облака

Ссылки по теме:

Соревнования по программированию на платформе All Cups

В гостях Дмитрий Санников рассказывает про соревнования по программированию, ИИ, машинному обучению и высоконагруженным системам на платформе All Cups.

  • All Cups — платформа для проведения соревнований
  • Кто является автором и инициатором соревнований?
  • Визитная карточка — интересные задачи
  • Online или Offline?
  • Призовой фонд?
  • Какие языки программирования популярны на соревнованиях?
  • Как взаимодействует код участника соревнования с платформой?
  • Локальная отладка?
  • Запуск в Docker под самописным оркестратором на Django
  • Пытались ли участники взломать платформу и как?
  • Какой KPI стоит перед командой?
  • Зачем участвовать в соревнованиях по программированию?
  • Образовательная часть проекта, бесплатные курсы
  • Ближайшие мероприятия

https://cups.mail.ru/ru/

Книга: Элегантные объекты

Прочитал книгу «Элегантные объекты» Егора Бугаенко: https://www.elegantobjects.org

Автор описывает свой взгляд на «правильное ООП»,  даёт практические рекомендации и показывает наглядные примеры, итоговая цель которых – хорошо поддерживаемый код! Я полностью разделяю эту ценность: поддерживаемость – это одна из важнейших характеристик кода.

Читать далее Книга: Элегантные объекты

Книга: Front Line PHP

Прочитал книгу Front Line PHP — Building modern applications with PHP 8https://front-linephp.com.

По большей части это сборник статей из блогов https://stitcher.io и https://freek.dev.

Читается легко и понятно, очень доступный английский. Первые две части просто отличные, но в третьей части «PHP in Depth» слишком поверхностный материал. Возможно, авторы не хотели переусложнять, либо поленились, либо сами пока не углублялись, но написать что-то надо было.

Надеюсь, книга будет «живой», т.е. дополняться материалом и углубляться. Кроме того, осенью нас уже ждёт PHP 8.1!

Книга платная, цена зависти от страны, для России около 1000р. Если цена кусается, рекомендую просто прочитать два упомянутых выше блога — бесплатно.

Кстати, некоторые статьи из них есть в переводе на Хабре, например От версии 8 к 8.1: новый виток развития PHP

PHP 8: план обновления

Как обновиться на PHP 8.0?

https://www.php.net/manual/ru/migration80.php

https://stitcher.io/blog/new-in-php-8

https://php.watch/versions/8.0

В первую очередь, ещё до обновления на PHP 8.0, нужно убедиться, что текущая кодовая база не выбрасывает никаких сообщений о deprications на текущей версии языка. Если такие есть, то их нужно поправить. То, что сегодня отображается как уведомление deprecated, завтра, на новой версии языка, может уже выбрасывать Fatal Error!

В PhpStorm есть инспекция «Language Level»: запустить её можно через меню Code -> RunInspection by Name… и в появившемся диалоге не забыть выбрать версию языка PHP 8 по ссылке Languages & Frameworks / PHP.

Хорошим подспорьем для плавного перехода будет кодовая база, написанная с использованием declare(strict_types=1); или покрытая статическим анализом типа Psalm,  PHPStan и т.п. Но если сейчас этого нет, то не стоит сломя голову добавлять типы, проще перейти на PHP 8.0 как есть, поправив все несовместимости. Однако, не имея типов, эти несовместимости будет сложнее найти.

Следующий полезный инструмент для проверки кода – это пакет PHPCompatibility. Устанавливается через composer и, по сути, это набор правил и проверок для PHP_CodeSniffer.

При первом запуске PHP_CodeSniffer у меня упал по недостатку памяти (не хватило 2Гб). И упал он на парсинге какого-то JavaScript файла. Поскольку JS нам не интересен, нужно добавить аргумент командной строки --extensions=php

Приложу ссылку на статью с подробным описанием, как запускать PHP_CodeSniffer вместе с PHPCompatibility: https://enzo.weknowinc.com/articles/2015/06/07/how-to-check-php-compatibility

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

В composer.json нужно установить значение config.platform.php и require.php в 8.0 и попробовать выполнить composer update – если какие-то из зависимостей, включая транзитивные, ещё не поддерживают PHP 8, то увидим подробное описание найденных несовместимостей.

Кстати, а чем отличаются эти две опции в composer.json — config.platform.php и версия PHP указанная в require? Хороший вопрос для отдельного выпуска Пятиминутки PHP. Впрочем, всё есть в документации к composer: https://getcomposer.org/doc/06-config.md#platform

Если нашлись несовместимые пакеты, что делать?

Проверить, возможно в composer.json зафиксированы слишком старые версии пакетов и их можно обновить на более свежие? А если в каких-то пакетах всё ещё нет поддержки PHP 8, то придётся делать fork. Кстати, чтобы использовать свой fork пакета вместо официального репозитория, в composer.json можно указать собственный альтернативный git репозиторий: https://matthewsetter.com/series/tooling/composer/forked-repositories/

Далее обратим внимание на используемые расширения PHP. Работают ли все подключённые внешние или не стандартные расширения с PHP 8? Все стандартные расширения «в поставке» точно поддерживают. А вот какие-то сторонние и экзотические нужно смотреть отдельно по их документации и последним обновлениям. Например, Xdebug уже поддерживает PHP 8!

Если все предварительные проверки пройдены, устанавливаем PHP 8 на локальную машину, чтобы прогнать тесты и проверить работоспособность кода в runtime.

Дальше, по идее, нужно обновлять production сервера. Но на деле не всегда это возможно сделать сразу. Поэтому какое-то время на production всё ещё будет крутиться предыдущая версия PHP. Как не запутаться и не испортить код?

Сначала нужно откатить версию в настройках composer config.platform.php до версии соответствующей production и сделать composer update.

Затем переключить Language Level в PhpStorm на более старую версию, чтобы случайно не написать какую-нибудь конструкцию в новом синтаксисе PHP 8. На самом деле PhpStorm автоматически подхватывает настройки версии PHP указанные в composer.json, но лучше ещё раз перепроверить и убедиться, что Language Level в PhpStorm соответствует production.

Не забудем про Continues Integration, чтобы в этот переходный период тесты гонялись и под текущую production версию PHP, и под PHP 8, таким образом мы сразу заметим случайную деградации кода.

После полного перехода на PHP 8, когда уже и на production серверах будет стоять свежая версия языка, можно начинать использовать новые фишки синтаксиса в коде. Обновить все исходники за раз до современного вида поможет утилита Rector – про неё я рассказывал в 81 эпизоде Пятиминутки PHP. Есть целый набор правил для Rector модифицирующих код под PHP 8, например, он может заменить switch/case на match (https://stitcher.io/blog/php-8-match-or-switch) где возможно или повсеместное внедрить constructor property promotion (https://stitcher.io/blog/constructor-promotion-in-php-8). 

Список доступных модификаций Rector далеко не полный, они не покрывают все возможности PHP8, это лишь начало пути.

Также я рекомендую применять правила Rector по одному и делать внимательный code review, т. к. иногда может что-то сломаться и потребуются ручные правки.

Нужно ли обновлять весь код на новый синтаксис единовременно? Обновление синтаксиса одним коммитом (или даже нескольким коммитами) сделает не релевантным git blame — возможно, это будет не очень удобно.

Я уже обновился на PHP 8.0 и записывал этот подкаст по памяти, возможно, упустил какие-то детали или нюансы. Если есть что добавить, пишите в комментариях на SoundCloud или на YouTube.