Способы ускорения PHP-приложений

На прошлом стриме мы с вами разобрались с разделением кода на модули и микросервисы. Пока записываются и монтируются скринкасты проведём наш очередной стрим на полезные смежные темы. В этот раз поговорим про способы оптимизации запуска и работы PHP-приложений:

Рассмотрим подходы к ускорению работы веб-приложения. От простого включения OpCache, кеширования конфигурации и ленивой инициализации сервисов до Preload с JIT и RoadRunner, асинхронности, использования Fiber-ов и других нюансов в разных фреймворках. Потренируемся на проектах с бэнчмарками. Поговорим про возможные проблемы, удобство программирования stateless-сервисов и про передачу контекста запроса.

UPD: Провели первую часть, где показали оптимизацию запуска существующих классических приложений на Slim и Symfony:

  • 00:00:00 - Приветствие
  • 00:00:53 - Вопросы в чате
  • 00:06:18 - Как работает проект и что мы можем ускорить
  • 00:31:07 - Демо-приложение на SlimPHP
  • 00:41:36 - Сервис Benchmark для замеров
  • 00:46:30 - Замеры производительности без оптимизаций
  • 00:49:28 - Случай из жизни
  • 00:52:26 - Кэширования опкодов с OpCache
  • 01:01:14 - Компиляция по требованию с JIT
  • 01:07:22 - Ручной прогрев OpCache через Preload
  • 01:24:34 - Где может пригодиться JIT
  • 01:30:23 - Кэширование конфигурации приложения
  • 01:53:57 - Долгоживущие приложения
  • 02:03:38 - Переход с PHP-FPM на RoadRunner
  • 03:07:48 - Демо-приложение на Symfony
  • 03:19:24 - OpCache и готовый Preload
  • 03:23:22 - Подключение RoadRunner к Symfony
  • 03:33:50 - Для Laravel и других фреймворков
  • 03:37:43 - Обзор результата и нюансы
  • 03:43:50 - Ответы на вопросы

И во второй части написали свой асинхронный Loop с таймером на PHP как на JavaScript и показали способы написания новых приложений на асинхронных фреймворках:

  • 00:00:00 - Приветствие
  • 00:01:29 - Про митап с докладом про асинхронность
  • 00:10:58 - Синхронная природа воркеров RoadRunner
  • 00:19:36 - Неудобства от Doctrine с EntityManager
  • 00:26:30 - Пересоздание EntityManager при ошибках
  • 00:40:18 - Сравнение PHP и Java по типизации с Go и TypeScript
  • 01:09:06 - Как устроен waitRequest в RoadRunner
  • 01:23:19 - Пишем Loop для отложенного выполнения кода
  • 01:47:04 - Пишем setTimeout на PHP
  • 02:10:35 - Блокирующий и неблокирующий код
  • 02:15:58 - Неблокирующая загрузка fetch по HTTP
  • 02:34:17 - EventLoop в JavaScript
  • 02:46:30 - Конкурентное и асинхронное выполнение
  • 02:52:56 - Объект Promise и ожидание результата через await
  • 03:11:03 - Ожидание группы через Promise::all
  • 03:13:32 - Идея генераторов с yield
  • 03:20:27 - Концепция зелёных потоков и Fiber
  • 04:00:10 - Практическая польза неблокирующего режима
  • 04:10:56 - Асинхронный сервер AmPHP
  • 04:24:35 - OpCache для консольных приложений
  • 04:25:20 - Скелет демонстрационного приложения
  • 04:29:06 - Работа с системными сигналами в Docker
  • 04:35:09 - Написание проекта на AmPHP HTTP Server
  • 04:40:09 - Использование Connection Pool для БД
  • 04:47:42 - Установка pcntl для работы с сигналами
  • 04:49:27 - Код приложения и тест производительности
  • 05:14:59 - Асинхронная инфраструктура ReactPHP
  • 05:19:25 - Отлов ошибок в Promise и await
  • 05:23:33 - Написание проекта на ReactPHP
  • 05:49:52 - Инфраструктура Swoole и OpenSwoole
  • 06:00:05 - Написание проекта на OpenSwoole
  • 06:26:45 - Проблема состояния и Statefull-сервисов
  • 06:40:04 - Stateless-сервисы и передача параметров запроса
  • 06:50:30 - Структура для описания контекста запроса
  • 07:05:58 - Использование ORM при кооперативном выполнении
  • 07:14:33 - Ответы на вопросы

Посмотреть записи обеих частей:

Комментарии (18)
Александр Панков

Оплачено!

Ответить
Максим (@myks92)

Доброго дня. С 1 декабря 2023 года изменились требования для системы Auth. https://www.consultant.ru/document/cons_doc_LAW_453265/3d0cac60971a511280cbba229d9b6329c07731f7/, https://journal.tinkoff.ru/news/stop-ino-id

Теперь владельцы российских сайтов и программ, где предусмотрена авторизация пользователей, должны проводить ее одним из четырех способов:

  1. По номеру мобильного телефона. Оператор связи может быть нероссийским — требований к нему в законе не предъявляется.
  2. Через ЕСИА — проще говоря, с помощью госуслуг.
  3. Через ЕБС, где хранятся биометрические данные россиян. Это изображения лица и образцы голоса, с помощью которых можно подтвердить свою личность.
  4. С помощью иной информационной системы, которой владеет гражданин России без второго гражданства или российское юрлицо. Таким условиям отвечают SSO, они же — системы авторизации, например VK ID и Яндекс ID.

Многие сайты уже убрали вход по networks, а так же вход по email. Фактически всё ведется к единому аккаунту. В связи с этим имеет смысл внести изменения в модуль Auth аукциона либо вовсе перейти на VK ID. Что думаете на этот счет?

Хочу отметить, что ответственности пока что нет, но к этому всё идёт.

Ответить
Дмитрий Елисеев

Таким условиям отвечают SSO, они же — системы авторизации, например VK ID и Яндекс ID.

Это и есть вход по OAuth. В проекте можно просто переименовать networks в providers. Остальное переделывать под них не нужно.

Ответить
Максим (@myks92)

Да, оно так и есть. Я больше не про название networks…

  1. Яндекс ID, Hoff, ЮМоней, METRO, Спорт-мастер, Лента полностью убрали регистрацию по почте. Так как в законе такого способа регистрации нет.
  2. Некоторые полностью убрали вход по networks: Яндекс ID, Спортмастер и другие. Пример https://passport.yandex.ru/auth/social-restricted?origin=home_yandexid&retpath=https%3A%2F%2Fpassport.yandex.ru%2F&backpath=https%3A%2F%2Fpassport.yandex.ru. При том что они были раньше. С чем это связано пока не понял.

Я всё веду к тому, что в текущую модель надо внести изменения:

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

А может и вовсе вместо своего Auth использовать Яндекс ID или VK ID. Чтобы не морочиться с этим всем.

Хотя это демо-проект, и, возможно, текущие предложения не актуальны.

P.S.: Так же хочу предложить использование Next-Auth версии 5 вместо текущей реализации UI. Очень сильно упрощает работу с Auth системой и реализации SSO. Ну и чистый React заменить на NextJS фреймворк App dir (V14). Очень много полезного сделано для современного UI. В том числе ServerActions. Пользуюсь этими решениями уже больше года. Очень доволен. Много чего готового, чего нет в чистом React.

Ответить
WorkStan

Так...

  1. не надо создавать панику раньше времени)))

  2. почта как была, так и осталась

  3. Касается входа через SSO при использовании "зарубежных" SSO "провайдеров".

Сервис авторизации !== электронная почта.

Т.е., грубо говоря закон называется: "Запрет авторизаций через иностранные сервисы".

Ответить
Максим (@myks92)
  1. Не создаю, а просто информирую, что наблюдаю крупных российских Auth систем.
  2. Тут вы не правы. Почты на иностранных доменах не проходях по закону. То есть с почтой example@gmail.com зарегистироваться нельзя. При этом можно пользоваться, если зарегистрировались ранее.
  3. Многие убирают почту не по этой причине. Тут есть разные факторы:
    • есть сервисы с временной почтой, которые позволяют делать кучу аккаунтов. Например, чтобы получить бесплатную подписку на 30 дней.
    • нельзя использовать почту зарубежных провайдеров.
    • пользователь может иметь несколько почтовых ящиков, при этом телефон, как правило, один - личный. К нему всё привязать проще, так и идентифицировать. А с процедурой смены оператора теперь нет необходимости делать разные номера при переходе к другому оператору. Кроме того по почте нельзя узнать паспортные данные, а по телефону можно (через оператора, например, по запросу МВД). Фактически телефон становится внегласным идентификатором пользователя

Поэтому проще убрать этот способ регистрации, как сделали многие российские Auth-сервисы. И панику вообще не нагоняю

Ответить
WorkStan

А можно по 2-му пункту цитату из закона - я пока не смог найти такого ограничения?

Ну и по 3-му пункту - по какой причине убирают почту - это, конечно, дело владельцев ресурсов, ну и снова про этот фактор: "нельзя использовать почту зарубежных провайдеров."

Я не нашёл пока что таких ограничений.

Ну и за информаирование - конечно, спасибо!

Ответить
Максим (@myks92)

Вот краткий пост с Хабра: https://habr.com/ru/news/751532

Вот ссылка на закон: http://publication.pravo.gov.ru/document/0001202307310022?index=2

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

  • номер телефона российского оператора связи;

  • данные для входа через единый портал «Госуслуг» (ЕСИА);

  • личные данные через Единую биометрическую систему (ЕБС);

  • иную информсистему, обеспечивающую авторизацию пользователей сайтов и владельцем которой является гражданин РФ, не имеющий гражданства другого государства, или российское юрлицо с иностранным владением менее 50%.

То есть про почту вообще ничего не сказано. Однако есть отдельные комментарии политиков для чего это делается. Чтобы не крали данные зарубежные сервисы. Поэтому почту использовать можно, если она «российская». Так же зарубежную можно перенести на «российскую» с помощью сервиса https://blog.mail.ru/xmail. Опять же закон касается больше таких гигантов как OZON ID, SberID, Yandex ID, VK ID и т.д. То есть вашему маленькому сервису, думаю, ничего не будет. Однако тенденция такая и стремиться к этому нужно. Особенно в новых проектах. Поэтому я и предлагаю сразу убрать почту. А так это вообще демо проект. Тут можно хоть как делать.

Ответить
WorkStan

Там просто к этим поправкам, вроде, ещё поправок добавили. Придётся ещё перечитывать....

Что касается практической части - только что входил на сайт mail, авторизовывался в почтовый ящик - попросили только имя пользователя и пароль, на телефон кодов не приходило, через госуслуги не требовали входа, ну и вообщем, никаких "ограничений" я не смог обнаружить, просто логин и пароль.

Или для mail.ru этих ограничений не существует? Иля это не российская компания?

Это так, к слову. Пойду ещё раз читать)))

Ответить
Максим (@myks92)
  1. Закон не имеет обратной силы.
  2. Вопрос касается РЕГИСТРАЦИИ, а не АВТОРИЗАЦИИ.
  3. Кроме того ещё не все так быстро переключились. Санкций за это пока что нет.
Ответить
WorkStan

только что зарегистрировался логин ivantestpetrov пароль TIadFP47pee(

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

Ответить
Максим (@myks92)

Читайте пункт 3.

Вы также правильно отметили, что Маил это VK. Однако стала она структурой VK относительно недавно. Там в целом ещё не до конца всё переведено на рельсы ВК. Так как у ВК есть свой ВК ID систему авторизации тут переделывать не будут. В какой-то момент просто сделают вход по VK ID и всё. VK ID это независимый ресурс. Регистрация в нем не означает регистрацию в социальной сети.

Попробуйте создать такой аккаунт на Яндекс. Ну или Яндекс ID https://passport.yandex.ru/auth/reg/portal?retpath=https%3A%2F%2Fid.yandex.ru%2F&noreturn=1

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

Ответить
WorkStan

Ок, спасибо. На этом пока завершим)

Ответить
Владимир Перепеченко

А вторую часть еще рано оплачивать? Что то ссылки не вижу.

Ответить
Дмитрий Елисеев

Оплата одна за две части. Ещё раз оплачивать не нужно.

Ответить
Евгений

Сегодня же Зенит - Спартак в 19.30

Ответить
Sergei

Дядь Дим, когда уже на джаву пойдем? Чтоб как у взрослых xD

Ответить
Зарегистрируйтесь или войдите чтобы оставить комментарий

Или войти через:

Google
GitHub
Yandex
MailRu