Обложка канала

Пых. Страница 6

4468 @phpyh

Блог @vudaltsov о разработке на PHP

  • Пых

    Поиск по нескольким словам в проекте Задача. Найти в проекте все файлы, в которых есть слова employee и department (обязательно оба в любом порядке). Пишите в комментариях, как вы бы решали эту задачу. Я расскажу, как найти файлы с использованием поиска по регулярному выражению в PhpStorm. В RegEx можно по-разному обозначить подстроку, но только lookahead и lookbehind позволяют комбинировать условия без определённого порядка. Получается следующий паттерн:
    ^(?=.*\bemployee\b)(?=.*\bdepartment\b).*$
    (?=) — positive lookahead, \b — граница слова, .* — любой символ. Однако в таком виде в PhpStorm паттерн не сработает, потому что в интерпертации IDE . не включает символ новой строки. Поэтому заменяем . на [\s\S] (любой пробельный или непробельный символ) и получаем рабочий шаблон:
    ^(?=[\s\S]*\bemployee\b)(?=[\s\S]*\bdepartment\b)[\s\S]*$
    Паттерн легко расширяется для поиска любого кол-ва слов. Источники: • https://stackoverflow.com/a/4389683, • https://bit.ly/3LeMPa9.
  • Пых

    Лето 2016-ого, «Территория Смыслов». 😅
  • Пых

    Мы перешли на PHP 8.1 😝 Тут могла бы быть история про долгий и сложный переход, но мы просто апнулись одним праздничным днём, и всё... За это, во-первых, спасибо инструментам статического анализа — с ними мы всегда уверены в forward-совместимости кода. А во-вторых — разработчикам PHP. Минорные и мажорные обновления стали плавными и качественными — большая часть депрекаций появляется и освещается в "СМИ" заранее, а откровенных багов стало очень мало. Также порадовали зависимости: composer why-not php ^8.1 на нашем проекте быстро стал пустым. Видимо, авторы большинства пакетов ещё в прошлый раз в require поставили ...|^8.0, поэтому к 8.1 они уже были готовы. Короче, полёт отличный, приглашаю обновиться. Если же пока нет такой возможности, обратите внимание на Rector. Через него можно делать бэкпорт, то есть писать на 8.1, а деплоить, например, 7.4. Сам не пробовал, если кто-то использует такую схему, расскажите про свой опыт, пожалуйста, в комментариях. ____________________ 🔥 Кстати, я актуализировал вакансию и жду ваши резюме!
    Пых

    Ищу к себе в команду middle/senior разработчика! В Happy Inc мы исследуем вовлечённость и лояльность персонала в крупных компаниях: проводим анонимные опросы, строим сложные отчёты, доставляем их клиентам в различных форматах. У нас модульный монолит без легаси. PHP 8.1 / Symfony 6.0 / PostgreSQL 14 / OpenAPI / CQRS / Event Sourcing / Psalm / Thesis и всё, о чём я тут рассказываю. 😜 Full-time, офис и удалёнка, ЗП по результатам собеса. Резюме мне в ЛС @vudaltsov.

    Telegram
  • Реклама

  • Пых

    uniqid() Функция uniqid — простой и быстрый способ получить ±уникальную криптографически небезопасную строку. Как она работает? Функция берёт секунды и микросекунды, прошедшие с начала эпохи Unix, и конкатенирует их в шестнадцатиричном представлении:
    function uniqid(): string
    {
        $time = gettimeofday();
    
        return sprintf('%x%x', $time['sec'], $time['usec']);
    }
    
    Таким образом, выдаваемая строка имеет длину 13 символов (как посчитать длину самому). Если требуется меньше, то отрезать нужно с конца, так как наибольшей энтропией обладают последние знаки. Например, чтобы получить 8 символов, используем выражение substr(uniqid(), -8). Первый необязательный параметр $prefix эквивалентен конкатенации $prefix.uniqid(). Второй необязательный параметр $more_entropy добавляет к результату псевдослучайное число, что снижает риск получить одинаковые значения в параллельных процессах. Такая строка содержит 23 символа и имеет вид 61e0e81a580527.28156047. Не стоит относиться к этой функции слишком серьёзно, но в простейших случаях, например, при именовании каких-нибудь временных штук, она избавит вас от 🚲.
  • Пых

    Avoid FPM reloading? На днях гулял по документации Deployer 7 и набрёл на статью Avoid PHP-FPM Reloading. Там даётся известная рекомендация использовать при конфигурации NGINX переменную $realpath_root вместо $document_root для SCRIPT_FILENAME. Это нужно для того, чтобы в opcache попадал реальный путь вместо симлинка и не было проблем при деплойменте. То же самое можно прочитать, например, в комментариях к примерному конфигу NGINX для Symfony. У нас так и настроено, однако от мягкой перезагрузки FPM мы не можем отказаться, так как используем preloading. И поэтому в статье меня смутила фраза "...reload can lead to dropped or failed requests". Погуглил, вроде FPM должен корректно завершать запросы, активные на момент reload. Да и мы за пару лет не видели релевантных ошибок при деплойментах. Поэтому считаю дисклеймер неверным. Также нашёл твит на Пятиминутке PHP с полезными ссылками про деплоймент и opcache. Вот такой дискуссионный пост получился. Пишите в комментариях, что думаете!
    Avoid PHP-FPM Reloading | Deployer

    Deployer symlinks current to latest release dir.

    deployer.org
  • Пых

    Организация миграций Doctrine В Doctrine Migrations есть классный параметр organize_migrations. Он позволяет группировать файлы миграций по годам (BY_YEAR) или по годам и месяцам (BY_YEAR_AND_MONTH). Рекомендую сразу переходить на BY_YEAR_AND_MONTH. Переключиться можно в любой момент. Для этого достаточно поправить конфиг и запустить мою команду — она раскидает файлики по нужным директориям. Команда расчитана на дефолтный Version{date} нейминг миграций. symfony.com/bundles…dex.html www.doctrine-project.org/project…ion.html
  • Пых

    📊 Итоги года В контексте PHP год пролетел для меня очень быстро, думаю, вы заметили по активности. Одна из причин — много интересной работы. Зато накопил уйму идей для постов и видео — буду исправляться. Ачивки 💡 Попробовали с Ромой новые форматы: интервью, Clubhouse что это?, Дайджест Live. Запустили канал с мемесами PHP умирает?! 🎙 Выступил на 4 оффлайн-конференциях и митапах. PHP привёз меня в Брянск, Нижний Новгород и Ростов-на-Дону. Зовите ещё — я с удовольствием путешествую по России! 🤣 Меня показали по телеку, и там я ответил на главный вопрос века репортёра: «Скажите, за базами данных будущее?» 🧑‍🎨 Пых получил свой логотип. 👊 В Пыхтелке появились админы, флуда и спама стало меньше. Спасибо ребятам большое! 😳 Моё отношение к трейтам не изменилось, но я законтрибьютил один в roave/dont. 🔥 Вошёл в программный комитет PHP Russia 2022. Фейлы ☹️ Нерелиз Thesis. Но я не отчаиваюсь! Yii3 ведь тоже не вышел. Недавно уделил либе несколько дней в отпуске и решил пару организационно-архитектурных проблем. Обещать ничего не буду, просто скажу, что идея жива и мы по-прежнему радостно используем Thesis на работе. Всем спасибо за участие в сообществе, до встречи в 🐯 году! Пройдите, пожалуйста, опрос — он наводит мост в 2022! https://phpsurvey.typeform.com/to/fqX8iwnT
    PHP-итоги года

    2-й ежегодный опрос PHP-сообщества: все, что было важно в уходящем году.

    Typeform
  • Пых

    Ночное образовательное шоу IT Nights 3.0 Приглашаю сегодня всех в 19:00 на IT Nights. Будут спикеры из Facebook, Яндекса, JetBrains, VK, X5 Group. Меня заинтриговал доклад Изменения — единственная константа в IT и рыцарский турнир, в котором примут участия ребята с Podlodka, Егор Толстой и Стас Цыганов. По промокоду phpyh скидка 20%.
  • Пых

    Ищу к себе в команду middle/senior разработчика! В Happy Inc мы исследуем вовлечённость и лояльность персонала в крупных компаниях: проводим анонимные опросы, строим сложные отчёты, доставляем их клиентам в различных форматах. У нас модульный монолит без легаси. PHP 8.0 / Symfony 5.3 / PostgreSQL 12 / OpenAPI 3 / EventSourcing / Psalm на максималках / Thesis и всё, о чём я тут рассказываю. 😜 Full-time, Москва, БЦ Варшавка Sky, ЗП по результатам собеса. Резюме можно присылать сразу мне в ЛС @vudaltsov.
    Опрос сотрудников и клиентов, рекомендации для развития - Happy Inc

    Опросник для персонала и клиентов со встроенными рекомендациями и инструментами для анализа. Гарантируем интересные и эффективные опросы для сотрудников - звоните, +7(495) 646-83-89, 8 (800) 600-31-89 - Happy Inc.

    happy-inc.ru
  • Пых

    Релиз PHP 8.1, запуск PHP Foundation и истории переезда на 8.0

    Обсудим апдейты нового релиза и новость о создании PHP Foundation — фонда в поддержку языка. А еще послушаем, как ребята из 4 компаний проекты на 8.0 перевозили: с чем столкнулись и что советуют. Стрим ведут Валентин Удальцов (Пых, PHP Point), Александр Макаров (Yii, PHP Russia), Роман Пронский (PHP Digest, PHP Point). Делиться кейсами переезда придут: - Евгений Прохоров (Skyeng) - Александр Данковцев (Авито) - Иван Корноухов (Badoo) - Максим Фомичев (ManyChat) Зафиналим стрим квизом от сообщества. Проведет Алексей Сундуков из самарского PHP-комьюнити.

    YouTube
  • Пых

    ?-> вместо NullObject: по следам дискуссии Предыдущий пост бурно и полезно обсудили, расписываю основные мысли. "За" и "против" использования ?-> для опциональных зависимостей: ➕ самый лаконичный способ до выхода PHP 8.1 (там можно будет использовать new для значений параметров по умолчанию); ➕ обходится дешевле в рантайме, так как в null-сценарии выполняется меньше кода (сразу оговорюсь, что это вообще сомнительный аргумент, в частности, трудно себе представить приложение без логгирования в продакшне); ➖ скрытый и "ненужный" if; ➖ NullObject — более корректное и универсальное с точки зрения ООП решение, null-safe подход может быть уместен только в нескольких случаях; ➖ на проекте без статического анализатора вероятность ошибки выше. Также в Пыхтелке затронули очень важную тему: зависимости редко бывают опциональными. Действительно, nullable зависимости часто сигнализируют о нарушении SRP. Необязательные поведения лучше оформлять в виде декораторов или middleware — их легко включать и выключать, не изменяя код (см. OCP). Что касается логгирования, его не всегда можно представить в виде декоратора. Зачастую полезная для логов информация инкапсулирована в реализации и не протекает через контракт. Скорее всего, в этом случае тоже где-то нарушается SRP, но добавление абстракции исключительно ради логгирования может быть неоправданным усложнением. И последний нюанс: зачем вообще делать логгер опциональной зависимостью, если он всегда есть в контейнере? Мой ответ простой: лень. В юнит-тестах, не тестирующих само логгирование, не хочется каждый раз писать new Service(/** required dependencies, */ new NullLogger()) ☺️. Итак, теперь мы знаем, что можно вот так нестандартно использовать ?->, но что это не всегда хорошая идея. Всем спасибо за комментарии!
  • Пых

  • Пых

    Тесты должны быть независимыми Юнит-тесты должны быть независимыми по определению. Всё необходимое инициализируется в блоке Arrange и утилизируется из памяти после Assert. Использовать в юнитах setUp / tearDown я не рекомендую. Тесты, работающие с общим состоянием, должны после выполнения возвращать его в исходную точку. Для этого можно использовать in-memory хранилища или откатывать транзакции. Чтобы защитить себя от неявных зависимостей между тестами, следует запускать их в случайном порядке. Для этого прописываем <phpunit executionOrder="random"> в phpunit.xml или выполняем phpunit с флагом --order-by=random.
  • Пых

    Кодишь 2.0 Мама, я в телевизоре! Большое спасибо организаторам конференции Кодишь 2.0 за приглашение и отличные выходные в Брянске! https://youtu.be/tBgpNqkoN_k P.S. Thesis ну прям очень скоро будет, в поезде многое доделал.
    В Брянске прошёл IT-форум

    ГТРК "Брянск" http://www.br-tvr.ru/

    YouTube
  • Пых

    LSP для конструктора __construct — особенный метод класса в PHP. В частности, он не подчиняется LSP, то есть в подклассе сигнатура конструктора может быть изменена как угодно. Это удобно в большинстве случаев, но не всегда. Иногда в базовом классе мы хотим предложить статическую фабрику. Чтобы она работала корректно, конструкторы подклассов должны соблюдать LSP. Есть два варианта, как это гарантировать. 1️⃣ Зафиналить конструктор в базовом классе. Минус в том, что мы не сможем инициализировать состояние в подклассе. Можно, конечно, добавить в базовый класс костыль в виде метода initialize, но есть решение поэлегантнее. 2️⃣ Попросить Psalm проверять LSP для __construct при помощи @psalm-consistent-constructor. Если конструктор подкласса не будет соблюдать сигнатуру, Psalm выбросит ConstructorSignatureMismatch. psalm.dev/docs/ru…ntiation