Завтра выступаю на PHPFest 🚀 с докладом про утечки памяти 💧
Буду говорить и лайвкодить на следующие темы:
• как следить за памятью в консольных командах;
• эффективная декомпозиция кода;
• copy-on-write;
• $real_usage в memory_get_usage();
• циклические ссылки наглядно;
• WeakReference, WeakMap;
• как следить за памятью в воркерах.
https://2020.phpfest.ru/lecture/3
Буду ждать вас на странице трансляции в 10:00 по Москве (в 14:00 по Новосибирску)!
Буду говорить и лайвкодить на следующие темы:
• как следить за памятью в консольных командах;
• эффективная декомпозиция кода;
• copy-on-write;
• $real_usage в memory_get_usage();
• циклические ссылки наглядно;
• WeakReference, WeakMap;
• как следить за памятью в воркерах.
https://2020.phpfest.ru/lecture/3
Буду ждать вас на странице трансляции в 10:00 по Москве (в 14:00 по Новосибирску)!
Разыгрываю билет на PHPFest 2020!
Задача
https://gist.github.com/vudaltsov/4c1fe1c2c2ad0f2a3850f5ef228e00db
Перед вами код фабрики тяжёлых отчётов. Отчёт генерируется на лету по запросу. В процессе фабрика может быть вызвана несколько раз для одного и того же экземпляра данных, поэтому предусмотрен in-memory кэш. В качестве сервера используется RoadRunner.
Как отрефакторить код, чтобы память не текла в PHP 7? В PHP 8?
Условия участия
• Нужно прислать правильные ответы на оба вопроса через бота (не через личные сообщения).
• Ответ для PHP 8 должен отличаться от ответа для PHP 7.
• Ответы принимаются сегодня до полуночи по Москве.
• Чтобы повысить шансы, нужно прислать простое и лаконичное решение как можно раньше.
Приз
Победителя определю я и опубликую его имя и решение утром. Герой получит доступ в личный кабинет и возможность посмотреть все доклады в записи в удобное время.
Удачи! 😊
Задача
https://gist.github.com/vudaltsov/4c1fe1c2c2ad0f2a3850f5ef228e00db
Перед вами код фабрики тяжёлых отчётов. Отчёт генерируется на лету по запросу. В процессе фабрика может быть вызвана несколько раз для одного и того же экземпляра данных, поэтому предусмотрен in-memory кэш. В качестве сервера используется RoadRunner.
Как отрефакторить код, чтобы память не текла в PHP 7? В PHP 8?
Условия участия
• Нужно прислать правильные ответы на оба вопроса через бота (не через личные сообщения).
• Ответ для PHP 8 должен отличаться от ответа для PHP 7.
• Ответы принимаются сегодня до полуночи по Москве.
• Чтобы повысить шансы, нужно прислать простое и лаконичное решение как можно раньше.
Приз
Победителя определю я и опубликую его имя и решение утром. Герой получит доступ в личный кабинет и возможность посмотреть все доклады в записи в удобное время.
Удачи! 😊
PHPFest 23-24 октября 2021
PHPFest в Новосибирске. Офлайн и Онлайн
Итоги конкурса!
Как я проверял ваши решения 🤓
Если ответ был текстовый, то я оценивал правильность идеи. Если ответ был кодом, то я тестировал его при помощи InMemoryCachingReportFactoryTest.php, предварительно адаптировав тест, если были изменены названия классов или добавлены зависимости. Если тест крашился из-за банальной ошибки (например, неинициализированного типизированного свойства), я такой ответ не засчитывал. Если в коде визуально были неточности, но мой несложный тест он проходил, я засчитывал. Думаю, это справедливо, всё-таки совсем непротестированный код на прод заливать не стоит 😉
Победитель 🏆
Первый правильный ответ пришёл от Andrew (@Groonya):
• https://gist.github.com/aivchen/39a956afc47634c7f8bb2de4688aa7c1 (PHP 7),
• https://gist.github.com/aivchen/5c8d51bed4188910ed34660c3b92fea0 (PHP 8).
Интересно, что в первом сниппете Андрея тоже есть неинициализированное свойство
Пояснение от меня 💡
Эту задачу я рассмотрю сегодня в рамках своего доклада. Решение выложил отдельным видео на PHP Point. Присоединяйтесь к PHPFest через 2 часа по ссылке https://2020.phpfest.ru/showtime/, всех жду!
Как я проверял ваши решения 🤓
Если ответ был текстовый, то я оценивал правильность идеи. Если ответ был кодом, то я тестировал его при помощи InMemoryCachingReportFactoryTest.php, предварительно адаптировав тест, если были изменены названия классов или добавлены зависимости. Если тест крашился из-за банальной ошибки (например, неинициализированного типизированного свойства), я такой ответ не засчитывал. Если в коде визуально были неточности, но мой несложный тест он проходил, я засчитывал. Думаю, это справедливо, всё-таки совсем непротестированный код на прод заливать не стоит 😉
Победитель 🏆
Первый правильный ответ пришёл от Andrew (@Groonya):
• https://gist.github.com/aivchen/39a956afc47634c7f8bb2de4688aa7c1 (PHP 7),
• https://gist.github.com/aivchen/5c8d51bed4188910ed34660c3b92fea0 (PHP 8).
Интересно, что в первом сниппете Андрея тоже есть неинициализированное свойство
$reports
, однако оператор ??=
на это по понятным причинам не ругается, поэтому формально код корректный.Пояснение от меня 💡
Gist
InMemoryCachingReportFactoryTest.php
GitHub Gist: instantly share code, notes, and snippets.
Сегодня в начале выступления была заминка из-за того, что у меня не работала команда
По скрину поймёте, почему 😂
Как известно, Symfony пробегает все файлы, зарегистрированные в DI как ресурсы, при прогреве кэша в dev. Соответственно, при автозагрузке демонстрационного класса
Неудивительно, что перезагрузка мака меня не спасла. В итоге я успешно показал всё на рабочем проекте, пока фоновый процесс в моей голове пытался понять, почему тут работает, а там нет.
🤦🤦♂️🤦♀️🙈
bin/console demo
в специально подготовленном для лайвкодинга проекте.По скрину поймёте, почему 😂
Как известно, Symfony пробегает все файлы, зарегистрированные в DI как ресурсы, при прогреве кэша в dev. Соответственно, при автозагрузке демонстрационного класса
App\Worker
в конце файла запускался этот самый воркер и начинал свой бесконечный цикл. Добавил эти строки я на последнем прогоне доклада и конечно же забыл удалить, поэтому сегодня утром "подвисание" команды для меня было полной неожиданностью...Неудивительно, что перезагрузка мака меня не спасла. В итоге я успешно показал всё на рабочем проекте, пока фоновый процесс в моей голове пытался понять, почему тут работает, а там нет.
🤦🤦♂️🤦♀️🙈
😅 Я не смог вас сегодня отпустить без подробного разбора вчерашней задачи, поэтому записал по горячим следам небольшой ролик на PHP Point.
Помимо комплексного решения для PHP 7 и PHP 8 я рассказал про маленькую неочевидную особенность
https://www.youtube.com/watch?v=r1HDMu7nJh0
Помимо комплексного решения для PHP 7 и PHP 8 я рассказал про маленькую неочевидную особенность
\WeakReference
и продемонстрировал, как можно тестировать утечки в PHPUnit в стиле тяп-ляп.https://www.youtube.com/watch?v=r1HDMu7nJh0
YouTube
Нюансы WeakReference & WeakMap на конкретном примере / Валентин Удальцов
Разбираем решение задачи про утечки, опубликованной на канале Пых в рамках конкурса совместно с PHPFest.
Полезные ссылки:
• мой доклад на PHPFest 2020 https://2020.phpfest.ru/lecture/3,
• условие задачи со ссылкой на код https://t.me/phpyh/182,
• победитель…
Полезные ссылки:
• мой доклад на PHPFest 2020 https://2020.phpfest.ru/lecture/3,
• условие задачи со ссылкой на код https://t.me/phpyh/182,
• победитель…
На сегодняшний день я участвовал пока только в трёх конференциях по PHP в качестве докладчика, и из них PHPFest отличился самым высоким уровнем организации.
Посудите сами, в результате созвона с командой PHPFest я купил нормальный микрофон, Ethernet-адаптер для стабильного соединения в офисе, и вместе мы добились качественного стриминга задолго до самой конференции.
Большое спасибо @seregazhuk за настойчивость и пунктуальность. После стольких прогонов никакая техническая проблема в моём сетапе не могла меня смутить, потому что я был на 110% уверен в своём докладе.
Уже через день после мероприятия на сайте появились записи докладов, а сегодня мне прислали подробный фидбэк по моему выступлению, после чего я всё бросил и пошёл писать этот пост.
@phpfest, вы огонь, спасибо за такой высокий уровень, пожалуйста, не расслабляйтесь, а остальные — подтягивайтесь!
Посудите сами, в результате созвона с командой PHPFest я купил нормальный микрофон, Ethernet-адаптер для стабильного соединения в офисе, и вместе мы добились качественного стриминга задолго до самой конференции.
Большое спасибо @seregazhuk за настойчивость и пунктуальность. После стольких прогонов никакая техническая проблема в моём сетапе не могла меня смутить, потому что я был на 110% уверен в своём докладе.
Уже через день после мероприятия на сайте появились записи докладов, а сегодня мне прислали подробный фидбэк по моему выступлению, после чего я всё бросил и пошёл писать этот пост.
@phpfest, вы огонь, спасибо за такой высокий уровень, пожалуйста, не расслабляйтесь, а остальные — подтягивайтесь!
При помощи
После вызова
Сравните: https://3v4l.org/LL8E9 и https://3v4l.org/jni5Y.
Generator::valid()
можно проверить генератор на пустоту, не обходя его целиком.После вызова
$generator->valid()
функция генератора начинает выполнение и доходит либо до первого yield (тогда valid
возвращает true
), либо до конца (valid
возвращает false
). Интересно, что в первом случае на генераторе можно вызвать rewind
без каких-либо последствий, так как обход ещё не начался. Во втором случае генератор закрывается и обойти его уже нельзя.Сравните: https://3v4l.org/LL8E9 и https://3v4l.org/jni5Y.
Завтра в 11 по Москве в пыхэфире Краснодар!
• 11:00 — Быстрый способ разобраться с легаси и начать жить (Сергей Жук, Skyeng)
• 12:00 — Автотесты: как тестировать нетестируемое (Артем Прозоров, ZeBrains)
• 13:00 — Как жить, если у тебя не хайлоад: истории из практики работы с реляционными БД (Валерий Горбачев, PHP Krasnodar)
Также в процессе стрима можно будет принять участие в квизе и выиграть билеты на PHP Russia, пхп-слонов и не только.
https://www.youtube.com/watch?v=Uezd5ocJQ9I
Темы задорные, постараюсь встать вовремя 😜
• 11:00 — Быстрый способ разобраться с легаси и начать жить (Сергей Жук, Skyeng)
• 12:00 — Автотесты: как тестировать нетестируемое (Артем Прозоров, ZeBrains)
• 13:00 — Как жить, если у тебя не хайлоад: истории из практики работы с реляционными БД (Валерий Горбачев, PHP Krasnodar)
Также в процессе стрима можно будет принять участие в квизе и выиграть билеты на PHP Russia, пхп-слонов и не только.
https://www.youtube.com/watch?v=Uezd5ocJQ9I
Темы задорные, постараюсь встать вовремя 😜
Пых
Завтра в 11 по Москве в пыхэфире Краснодар! • 11:00 — Быстрый способ разобраться с легаси и начать жить (Сергей Жук, Skyeng) • 12:00 — Автотесты: как тестировать нетестируемое (Артем Прозоров, ZeBrains) • 13:00 — Как жить, если у тебя не хайлоад: истории…
Цитирую @seregazhuk:
Не бывает кода, который потом понадобится. Выкидывайте! Есть гит, он всё помнит. Как правило, "код который понадобится" никогда не понадобится.
Я тоже советую чаще делать выбор в пользу удаления. Если коммиты атомарные и с хорошим комментарием, найти их в истории и восстановить не составит труда. А вот кода любого сорта, в том числе WTF-, непокрытого и потенциально уязвимого автоматически станет меньше.
https://www.youtube.com/watch?v=Uezd5ocJQ9I&t=1133
Не бывает кода, который потом понадобится. Выкидывайте! Есть гит, он всё помнит. Как правило, "код который понадобится" никогда не понадобится.
Я тоже советую чаще делать выбор в пользу удаления. Если коммиты атомарные и с хорошим комментарием, найти их в истории и восстановить не составит труда. А вот кода любого сорта, в том числе WTF-, непокрытого и потенциально уязвимого автоматически станет меньше.
https://www.youtube.com/watch?v=Uezd5ocJQ9I&t=1133
Build Stuff Software Development 2020 уже в эту среду!
Build Stuff проводят на этой неделе конференцию и предложили мне разыграть на канале 5 билетов. Мероприятие традиционно проходит в Европе, но в этом непростом году пройдёт онлайн.
Конференция будет в эфире три дня (11-13 ноября), и на ней обсудят все баззворды на свете от машин лёрнинга до девопса. Меня особенно заинтересовала секция Hiding The Lead (13 ноября в 11:00) Сэма Ньюмена, авторитетного автора книг по микросервисной архитектуре.
К сожалению, придумать хорошую задачу в этот раз не успеваю, разыграем 5 билетов рандомно 🎲
Заполняйте форму сегодня до полуночи, и завтра в Пыхтелке я объявлю победителей.
Build Stuff проводят на этой неделе конференцию и предложили мне разыграть на канале 5 билетов. Мероприятие традиционно проходит в Европе, но в этом непростом году пройдёт онлайн.
Конференция будет в эфире три дня (11-13 ноября), и на ней обсудят все баззворды на свете от машин лёрнинга до девопса. Меня особенно заинтересовала секция Hiding The Lead (13 ноября в 11:00) Сэма Ньюмена, авторитетного автора книг по микросервисной архитектуре.
К сожалению, придумать хорошую задачу в этот раз не успеваю, разыграем 5 билетов рандомно 🎲
Заполняйте форму сегодня до полуночи, и завтра в Пыхтелке я объявлю победителей.
Завтра в 11 по Москве в пыхэфире Нижний!
• 11:00 — MySQL vs Postgres (Антон Робуль)
• 12:00 — Полезные привычки для программистов (Олег Скляров, Skyeng)
• 13:00 — Очередной проект: взлетит или нет (Сергей Пантюшин, ВодоходЪ)
Также в процессе стрима можно будет принять участие в квизе и выиграть билеты на PHP Russia, пхп-слонов и не только.
https://youtu.be/pe3b0DHVnq8
• 11:00 — MySQL vs Postgres (Антон Робуль)
• 12:00 — Полезные привычки для программистов (Олег Скляров, Skyeng)
• 13:00 — Очередной проект: взлетит или нет (Сергей Пантюшин, ВодоходЪ)
Также в процессе стрима можно будет принять участие в квизе и выиграть билеты на PHP Russia, пхп-слонов и не только.
https://youtu.be/pe3b0DHVnq8
PHP 🎱
Уже завтра, за день до релиза, будет большой стрим про PHP 8 от Skyeng, PHP Russia и PHP Point!
В программе:
• дискуссия о развитии PHP с Альбертом Степанцевым,
• обзор новых фич восьмёрки от меня,
• Q&A с ключевыми разработчиками PHP Дмитрием Стоговым и Никитой Поповым.
Ведущие Александр Макаров и Роман Пронский.
Подключайтесь, общайтесь и задавайте вопросы! Начало в 19 по Москве 🕖
https://www.youtube.com/watch?v=QSszmWIrRyw
Уже завтра, за день до релиза, будет большой стрим про PHP 8 от Skyeng, PHP Russia и PHP Point!
В программе:
• дискуссия о развитии PHP с Альбертом Степанцевым,
• обзор новых фич восьмёрки от меня,
• Q&A с ключевыми разработчиками PHP Дмитрием Стоговым и Никитой Поповым.
Ведущие Александр Макаров и Роман Пронский.
Подключайтесь, общайтесь и задавайте вопросы! Начало в 19 по Москве 🕖
https://www.youtube.com/watch?v=QSszmWIrRyw
YouTube
PHP 8: что нового, туда ли двигается, что будет дальше
5:35 - дискуссия "Тем ли путем идет PHP" между Валентином Удальцовым и Альбертом Степанцевым
29:05 - доклад "PHP 8: userland" от Валентина
1:05:30 - обсуждение доклада с Романом Пронским и Александром Макаровым
1:27:25 - Q&A с ключевыми разработчиками 8…
29:05 - доклад "PHP 8: userland" от Валентина
1:05:30 - обсуждение доклада с Романом Пронским и Александром Макаровым
1:27:25 - Q&A с ключевыми разработчиками 8…
Встречаем PHP 8!
🔴 Трансялция на PHP Point: https://www.youtube.com/watch?v=QSszmWIrRyw.
🗺 Слайды моей презентации: https://vudaltsov.github.io/php8-slides/.
🔴 Трансялция на PHP Point: https://www.youtube.com/watch?v=QSszmWIrRyw.
🗺 Слайды моей презентации: https://vudaltsov.github.io/php8-slides/.
Прямо сейчас очень интересная дискуссия Дмитрия Стогова и Никиты Попова про типы, компиляцию, async/await, корутины и траекторию развития PHP.
https://www.youtube.com/watch?v=QSszmWIrRyw
https://www.youtube.com/watch?v=QSszmWIrRyw
Deprecations
Чтобы проект был всегда готов к обновлению языка и зависимостей, я рекомендую следить за депрекациями (устаревшими возможностями) и фиксить их как можно раньше.
Сегодня в PHP для этого полно инструментов, мы с командой пользуемся этими:
• Deprecated* issue в Psalm (в PHPStan есть phpstan-deprecation-rules);
• канал
• команда
• вкладка Deprecations в разделе Logs в Symfony Profiler;
• подписка на релизы пакетов и внимательное их изучение.
Чтобы проект был всегда готов к обновлению языка и зависимостей, я рекомендую следить за депрекациями (устаревшими возможностями) и фиксить их как можно раньше.
Сегодня в PHP для этого полно инструментов, мы с командой пользуемся этими:
• Deprecated* issue в Psalm (в PHPStan есть phpstan-deprecation-rules);
• канал
deprecation
в Monolog (см. рецепт MonologBundle);• команда
debug:container --deprecations
(выводит список устаревших сервисов, замеченных при сборке DI контейнера Symfony);• вкладка Deprecations в разделе Logs в Symfony Profiler;
• подписка на релизы пакетов и внимательное их изучение.
Ребята в Пыхтелке напомнили про Symfony PHPUnit Bridge.
В этом пакете есть
Спасибо @chi_teck и @andrewDemb.
В этом пакете есть
SymfonyTestsListener
, который в том числе умеет учитывать депрекации при тестировании. Его необязательно использовать с simple-phpunit
, можно со стандартным phpunit
. Подробнее о подключении и настройке читайте в документации.Спасибо @chi_teck и @andrewDemb.
Telegram
Пыхтелка
Основной чат канала Пых @phpyh для обсуждения разработки на PHP.
Правила группы: t.me/phpyhtelka/77070
Правила группы: t.me/phpyhtelka/77070
dbal:run-sql
Недавно абсолютно случайно наткнулся на команду
При помощи команды можно выполнить SQL запрос через любое сконфигурированное в приложении подключение, не заморачиваясь с доступами. Очень удобно использовать в Makefile и CI.
Недавно абсолютно случайно наткнулся на команду
dbal:run-sql
(всё-таки полезно гулять по папке vendor 🤓). Она поставляется с пакетом Doctrine DBAL, поэтому доступна не только симфонистам и ормщикам.При помощи команды можно выполнить SQL запрос через любое сконфигурированное в приложении подключение, не заморачиваясь с доступами. Очень удобно использовать в Makefile и CI.
bin/console dbal:run-sql \
--connection=name \
'select ... from ...'
Сейчас в эфире на канале PHP Point первый Дайджест Стрим!
Обратите внимание, что ссылка другая, не та, которую шерили утром.
https://www.youtube.com/watch?v=i9iC58z0yHE
Обратите внимание, что ссылка другая, не та, которую шерили утром.
https://www.youtube.com/watch?v=i9iC58z0yHE
YouTube
PHP Digest Live #194. Каким может быть Enum в PHP 8.1, про новый PhpStorm, JetBrains Qodana
PHP-Дайджест № 194 (1 – 14 декабря 2020) https://habr.com/ru/post/532950/
Подписывайтесь на наши каналы в Telegram:
• PHP Digest https://t.me/phpdigest,
• Пых https://t.me/phpyh,
• PHP умирает?! https://t.me/isPHPdying.
Подписывайтесь на наши каналы в Telegram:
• PHP Digest https://t.me/phpdigest,
• Пых https://t.me/phpyh,
• PHP умирает?! https://t.me/isPHPdying.