Используете AAA (arrange-act-assert/given-when-then) при тестировании?
Anonymous Poll
44%
да
18%
нет
38%
не пишу тесты
Итак, по результатам опроса 44% респондентов используют AAA pattern при тестировании
Я обычно отделяю части комментариями, хотя кто-то просто пустыми строками, но периодически сам забываю, периодически команда приносит тесты с несколькими
Поэтому запилил правило для ректора на этот счет, может и вам будет полезно
Я обычно отделяю части комментариями, хотя кто-то просто пустыми строками, но периодически сам забываю, периодически команда приносит тесты с несколькими
act-assertПоэтому запилил правило для ректора на этот счет, может и вам будет полезно
Telegram
msavin
Используете AAA (arrange-act-assert/given-when-then) при тестировании?
да / нет / не пишу тесты
да / нет / не пишу тесты
🔥4❤1
Замутил бэйджик для библиотек, которые оптимизировали свой дистрибутив для скачивания конечным пользователем
Вот инструкция, как добавить его к своему репозиторию
Вот инструкция, как добавить его к своему репозиторию
👍6❤1
Правило для ректора, добавляющее именованные аргументы, теперь умеет убирать дефолтные значения из переданных аргументов, чтобы код был еще выразительнее, пробуйте 🙂
GitHub
GitHub - savinmikhail/AddNamedArgumentsRector: Plugin to rector, that adds named arguments to your codebase
Plugin to rector, that adds named arguments to your codebase - savinmikhail/AddNamedArgumentsRector
🔥10
image_2025-10-18_19-51-45.png
141.6 KB
Мне окончательно надоело, что в симфоневом профайлере нельзя посмотреть тело ответа, только заголовки. Толку то мне от заголовков..
Благо симфа и здесь легко расширяется, поэтому я быстреньконавайбкодил написал бандл, позволяющий смотреть содержимое ответа. Аналогов найти я не смог(
По умолчанию работает для json- и text- подобных mime-типов, и обрезает слишком большие ответы (настраиваемо).
Если разделяете мою боль - велком
Благо симфа и здесь легко расширяется, поэтому я быстренько
По умолчанию работает для json- и text- подобных mime-типов, и обрезает слишком большие ответы (настраиваемо).
Если разделяете мою боль - велком
🔥15🤩1
Новый тех на канале!
Было 3 задачи: первая это кодревью php кода, 2 другие - проектирование баз данных
Было 3 задачи: первая это кодревью php кода, 2 другие - проектирование баз данных
YouTube
Собеседование PHP на 275к
Это запись технического собеседования на позицию php разработчика. На собеседовании было 3 задачи - одна на php на code review, 2 - что-то вроде system design, но в основном дизайн именно базы данных
Через 2 часа после собеседования мне скинули оффер
Мой…
Через 2 часа после собеседования мне скинули оффер
Мой…
🔥18❤2
Залил видео нового формата - что-то вроде разбора частых ошибок (если ты бородатый симфонист, то скипай). В данном случае - как валидировать реквесты в симфе. Вопрос в целом тривиальный, но постоянно вижу велосипеды, пару из них даж нашел и вставил в видос
Вдобавок закинул тех на ютуб
Была задача на ревью, поинтереснее прошлой, проектирование базы и 2 десятка теоретических вопросов по базам, пхп, архитектуре и безопасности
Вдобавок закинул тех на ютуб
Была задача на ревью, поинтереснее прошлой, проектирование базы и 2 десятка теоретических вопросов по базам, пхп, архитектуре и безопасности
1👍9🔥3❤2
Какие mcp сервера посоветуете? Я пока остановился на ctx и firecrawl, остальные кажутся бесполезными :(
GitHub
GitHub - context-hub/generator: CTX: a tool that solves the context management gap when working with LLMs like ChatGPT or Claude.…
CTX: a tool that solves the context management gap when working with LLMs like ChatGPT or Claude. It helps developers organize and automatically collect information from their codebase into structu...
👍6❤1
Открыл PR в php-src, добавляющий для
RFC пока не делал, подожду реакции от internals
Если тебе кажется удобной такая фича, поставь пж 👍 на мр 🙂
BackedEnum нативный метод values, потому что часто вижу в проектах создают трейт под это делоRFC пока не делал, подожду реакции от internals
Если тебе кажется удобной такая фича, поставь пж 👍 на мр 🙂
GitHub
Add values() Method to BackedEnum by savinmikhail · Pull Request #20398 · php/php-src
Add values() Method to BackedEnum
Summary
Introduce a native BackedEnum::values() static method that returns the list of all backing values (int|string) of a backed enum's cases in declarat...
Summary
Introduce a native BackedEnum::values() static method that returns the list of all backing values (int|string) of a backed enum's cases in declarat...
👍15🔥3❤1
Пока идет обсуждение моего RFC в пыху, узнал, что
А вы знали про такое?
array_column может доставать не только колонки массива, как казалось бы, но и свойства объектов:
enum Status: string {
case Active = 'active';
case Inactive = 'inactive';
case Pending = 'pending';
}
// What does self::cases() return?
var_dump(Status::cases());
// array(3) {
// [0]=> enum(Status::Active) // <- These are OBJECTS
// [1]=> enum(Status::Inactive) // <- Not arrays
// [2]=> enum(Status::Pending)
// }
// Each case object has public readonly properties:
$case = Status::Active;
echo $case->value; // "active" (string - the backing value)
// array_column can extract these properties!
$values = array_column(Status::cases(), 'value');
var_dump($values);
// array(3) {
// [0]=> string(6) "active"
// [1]=> string(8) "inactive"
// [2]=> string(7) "pending"
// }
А вы знали про такое?
👍23💯4
Вы знали, что у php-fpm можно получить вот такую статистику работы, в том числе по пуллам?
URL эндпойнта можно менять в конфиге (и в nginx'е обновлять локейшн), а формат можно менять в query параметрах (json/html/text)
Не то чтобы эта инфа очень мне помогла, но было интересно понаблюдать за своим приложением, может и вам пригодится 🙂
Дока здесь
URL эндпойнта можно менять в конфиге (и в nginx'е обновлять локейшн), а формат можно менять в query параметрах (json/html/text)
Не то чтобы эта инфа очень мне помогла, но было интересно понаблюдать за своим приложением, может и вам пригодится 🙂
Дока здесь
👍13🔥5
Микролайфхак:
Если перемещать файлы обычным
- файл
- новый
История теряет контекст, blame обнуляется, diff выходит огромным
«Это тот же файл, просто теперь он здесь».
И в итоге в diff появляется аккуратное
Справедливости ради шторм так и делает под капотом, а вот при работе в других средах надо иметь ввиду. Ну или сказать llm'ке, чтоб имела ввиду 🙂
git mvЕсли перемещать файлы обычным
mv, git вообще не понимает, что произошло. На примере с картинки он видит это как:- файл
console будто удалили- новый
config/console будто появился из ниоткуда.История теряет контекст, blame обнуляется, diff выходит огромным
git mv делает то же самое перемещение, но еще и сообщает git'у:«Это тот же файл, просто теперь он здесь».
И в итоге в diff появляется аккуратное
renamed, а не двойной дифф, который занимает весь экранСправедливости ради шторм так и делает под капотом, а вот при работе в других средах надо иметь ввиду. Ну или сказать llm'ке, чтоб имела ввиду 🙂
👍31
Топ видос, как вы считаете? Боюсь представить сколько сил потребовалось чтоб снять его)
Forwarded from vysmv
Media is too big
VIEW IN TELEGRAM
Как устроен PHP 🐘: фундаментальное знание для инженеров
В этом видео мы шаг за шагом разберём, как из исходного кода рождается процесс.
Пройдем путь от компиляции к интерпретации, от fork() и execve до php-fpm.
🔹 Подходит тем, кто хочет понять, как реально работает PHP и интерпретируемые языки в Linux.
🔹 Без магии — только системная логика и живая демонстрация в терминале.
Таймкоды:
00:09 Введение.
01:32 Классическая схема. Компилируемые языки.
02:29 Альтернативный подход. Интерпретируемые языки.
04:16 Подведём итог.
04:39 Погружение.
04:54 PHP как язык.
05:19 PHP как интерпретатор.
05:46 SAPI (Server API).
15:28 Ядро (Zend Engine).
16:03 Набор расширений (Extensions).
16:44 Резюме по интерпретатору.
17:38 Практика. Подготовка демонтстрационного стенда.
18:15 CGI и Apache2.
22:19 Принцип запуска программ в терминале.
29:56 Общий принцип работы с вводом и выводом в Unix-подобных системах.
35:39 CLI профиль.
38:54 Возвращаемся к CGI и Apache2.
47:45 Fast CGI.
54:54 Итог.
В этом видео мы шаг за шагом разберём, как из исходного кода рождается процесс.
Пройдем путь от компиляции к интерпретации, от fork() и execve до php-fpm.
🔹 Подходит тем, кто хочет понять, как реально работает PHP и интерпретируемые языки в Linux.
🔹 Без магии — только системная логика и живая демонстрация в терминале.
Таймкоды:
00:09 Введение.
01:32 Классическая схема. Компилируемые языки.
02:29 Альтернативный подход. Интерпретируемые языки.
04:16 Подведём итог.
04:39 Погружение.
04:54 PHP как язык.
05:19 PHP как интерпретатор.
05:46 SAPI (Server API).
15:28 Ядро (Zend Engine).
16:03 Набор расширений (Extensions).
16:44 Резюме по интерпретатору.
17:38 Практика. Подготовка демонтстрационного стенда.
18:15 CGI и Apache2.
22:19 Принцип запуска программ в терминале.
29:56 Общий принцип работы с вводом и выводом в Unix-подобных системах.
35:39 CLI профиль.
38:54 Возвращаемся к CGI и Apache2.
47:45 Fast CGI.
54:54 Итог.
2🔥30❤7👍3👌2
Хотите на собесе рассказать как ускорили запрос в 60 раз?
Недавно впервые споткнулся об JIT в Postgresql:
Был обычный SELECT по партиционированной таблице на ~390млн строк, причем WHERE по индексам
Но на боевой базе жесть как тормозил
Конечно запустил EXPLAIN ANALYZE, а там JIT занимает 16 секунд (!) из 16.2
Видимо из-за фильтров/кастов/количества партиций планировщик насчитал огромную стоимость запроса, хотя на практике это не подтвердилось
Решается это супер просто - достаточно перед запросом прописать SET jit = off;
После этого запрос стал выполнятся за ~250ms
Кстати, можете интерактивно поизучать план этого запроса вот здесь (но я выкинул из плана 388 партиций из 390)
Недавно впервые споткнулся об JIT в Postgresql:
Был обычный SELECT по партиционированной таблице на ~390млн строк, причем WHERE по индексам
Но на боевой базе жесть как тормозил
Конечно запустил EXPLAIN ANALYZE, а там JIT занимает 16 секунд (!) из 16.2
Видимо из-за фильтров/кастов/количества партиций планировщик насчитал огромную стоимость запроса, хотя на практике это не подтвердилось
Решается это супер просто - достаточно перед запросом прописать SET jit = off;
После этого запрос стал выполнятся за ~250ms
Кстати, можете интерактивно поизучать план этого запроса вот здесь (но я выкинул из плана 388 партиций из 390)
🔥21👍5
Замутил репозиторий, демонстрирующий шардирование в стеке PHP, Symfony, Postgresql: https://github.com/savinmikhail/sharding-example
Там есть 2 консольные команды демонстрирующие хэш и directory based шардирование. Соответственно первый вариант полностью прозрачен для приложеньки, а второй вариант - нет, но зато поможет с изоляцией горячих ключей
Координатор - Citus
Кому тема кажется страшной и сложной - велком потыкать руками, чтоб понять как примерно это выглядит
Там есть 2 консольные команды демонстрирующие хэш и directory based шардирование. Соответственно первый вариант полностью прозрачен для приложеньки, а второй вариант - нет, но зато поможет с изоляцией горячих ключей
Координатор - Citus
Кому тема кажется страшной и сложной - велком потыкать руками, чтоб понять как примерно это выглядит
GitHub
GitHub - savinmikhail/sharding-example
Contribute to savinmikhail/sharding-example development by creating an account on GitHub.
🔥24👍4🏆3❤1
Выложил второй (из планируемых 4х) видос по сисдизу
Заодно сделал репозиторий, демонстрирующий репликацию в стеке Postgresql + PHP (Symfony)
Можете потыкать, он в целом аналогичен примеру с шардированием
Заодно сделал репозиторий, демонстрирующий репликацию в стеке Postgresql + PHP (Symfony)
Можете потыкать, он в целом аналогичен примеру с шардированием
YouTube
System Design: масштабирование БД
В этом видео рассказываю про масштабирование базы данных
Сначала смотрим на примере расчета нефункциональных требований (NFR) как вообще понять необходимость масштабирования.
Затем на кейсах разберем партиционирование/шардирование/репликацию, и какие проблемы…
Сначала смотрим на примере расчета нефункциональных требований (NFR) как вообще понять необходимость масштабирования.
Затем на кейсах разберем партиционирование/шардирование/репликацию, и какие проблемы…
🔥23❤3👍3
Есть относительно популярный вопрос на собесах - про множественное наследование в пхп
Тут есть пожалуй три уровня ответа:
1) Трейты. Это все знают
2) Интерфейсы могут наследовать множество других интерфейсов:
С этим уже мало кто сталкивался
3) Класс наследует константы от интерфейса. Класс может имплементить много интерфейсов. Значит класс может наследовать константы от множества интерфейсов. Получается множественное наследование, но только для констант. При этом если константы будут одинаково называться, пхп не будет решать конфликт, просто кинет фатальную ошибку
Вот пример, чтоб поиграться - https://onlinephp.io/c/9c75c
Предположу, что есть секретные уровни, особенно если погрузится в исходники языка, и как там интерфейсы работают, пишите, если знаете еще какие-то подходящие механизмы
Тут есть пожалуй три уровня ответа:
1) Трейты. Это все знают
2) Интерфейсы могут наследовать множество других интерфейсов:
interface Foo extends Bar, Baz
С этим уже мало кто сталкивался
3) Класс наследует константы от интерфейса. Класс может имплементить много интерфейсов. Значит класс может наследовать константы от множества интерфейсов. Получается множественное наследование, но только для констант. При этом если константы будут одинаково называться, пхп не будет решать конфликт, просто кинет фатальную ошибку
Вот пример, чтоб поиграться - https://onlinephp.io/c/9c75c
Предположу, что есть секретные уровни, особенно если погрузится в исходники языка, и как там интерфейсы работают, пишите, если знаете еще какие-то подходящие механизмы
onlinephp.io
PHP Sandbox - Execute PHP code online through your browser
Run PHP code in your browser online with this tool in 400+ PHP versions
👍22😁4🤔3❤2💯1
⚡13🔥12👍2
Новое видео про распределенные транзакции, saga pattern, tcc, 2pc, eventual & strong consistency.
И немного про transactional outbox, но про него будто бы из каждого утюга слышно 🤷♂️
И немного про transactional outbox, но про него будто бы из каждого утюга слышно 🤷♂️
YouTube
Распределенные транзакции в микросервисах: 2PC, TCC, Saga, outbox
В этом видео разбираем распределенные транзакции в микросервисах: почему обычный ACID-подход перестает работать, чем отличаются 2PC, TCC и Saga, как transactional outbox решает проблему dual write. Также обсуждаем eventual consistency и strong consistency…
🔥21