#psalm
Как использовать Psalm на легаси проекте
Если вы задумались о необходимости использования Psalm'а на большом легаси проекте, вам нужно подумать, что делать с текущими ошибками, которых наверняка может быть больше тысячи.
Править их все сразу — это мог быть правильный вариант, если не был бы таким утомительным и долгим.
Глобально подавлять ошибки — это однозначно плохой способ, так как повлияет и на новый код.
Конфиг
Можно воспользоваться конфигом псалма и заигнорировать те директории, где расположен старый код. Однако в таком варианте необходимо, чтобы старый код был однозначно локализован. Такое возможно при наличии некоего подобия модулей, чем может похвастаться далеко не каждый легаси проект.
Этот способ имеет ещё один недостаток: наверняка вы до сих пор что-то правите в этих модулях, и тогда ваш новый код в старых модулях тоже не будет проанализирован псалмом. Но вы же не этого добивались?
psalm-baseline
У псалма есть решение для таких случаев —
У вас в проекте появится
И так до тех пор, пока вы не избавитесь от всех ошибок, либо не удалите модули, заменив их новыми 😎.
Как использовать Psalm на легаси проекте
Если вы задумались о необходимости использования Psalm'а на большом легаси проекте, вам нужно подумать, что делать с текущими ошибками, которых наверняка может быть больше тысячи.
Править их все сразу — это мог быть правильный вариант, если не был бы таким утомительным и долгим.
Глобально подавлять ошибки — это однозначно плохой способ, так как повлияет и на новый код.
Конфиг
Можно воспользоваться конфигом псалма и заигнорировать те директории, где расположен старый код. Однако в таком варианте необходимо, чтобы старый код был однозначно локализован. Такое возможно при наличии некоего подобия модулей, чем может похвастаться далеко не каждый легаси проект.
<psalm>
....
<projectFiles>
<directory name="src"/>
<ignoreFiles>
<directory name="src/Module1"/>
<directory name="src/Module2"/>
<directory name="src/Module3"/>
</ignoreFiles>
</projectFiles>
....
</psalm>
Этот способ имеет ещё один недостаток: наверняка вы до сих пор что-то правите в этих модулях, и тогда ваш новый код в старых модулях тоже не будет проанализирован псалмом. Но вы же не этого добивались?
psalm-baseline
У псалма есть решение для таких случаев —
baseline
. Данный способ найдёт и сохранит все текущие ошибки в конкретный xml
файл и будет их игнорировать при анализе. Также вам не придётся игнорировать директории и глобально подавлять ошибки. Зато новый код в любых директориях — новых и старых — будет успешно проанализирован псалмом. Чтобы настроить baseline,
вам необходимо выполнить следующую команду в вашем проекте:
./vendor/bin/psalm --set-baseline=psalm-baseline.xml
У вас в проекте появится
psalm-baseline.xml
файл, который необходимо закоммитить. Теперь вы сможете спокойно использовать psalm в CI.
Только не забывайте в свободное время править ошибки в старых модулях. Когда вы поправите часть из них, обновите baseline
: ./vendor/bin/psalm --update-baseline
И так до тех пор, пока вы не избавитесь от всех ошибок, либо не удалите модули, заменив их новыми 😎.
👍17🔥5
#symfony
Основная беда Symfony – она предоставляет богатые возможности для решения многочисленных сложных проблем, но с помощью нее сложно решать простые задачи. Например, возьмем миддлвары. Достаточно простой и удобный механизм, упрощающий написание http-обработчиков. Для миддлвар даже придумали стандарт в php-fig.
С помощью миддлвар можно подготавливать запрос, ограничивать доступ, декорировать запрос и ответ для логирования, обработки ошибок и многое другое. Сейчас миддлвары можно имитировать с помощью событий ядра, однако это неудобно, так как приходится помнить о приоритете выполнения слушателей, и неявно, потому что непонятно, какой именно слушатель перехватил запрос.
В Laravel, например, есть миддлвары, хоть и не следующие стандарту psr-15. Можно ли такое сделать в Symfony? Оказывается, можно. Есть такой пакет, который реализует psr-15 и дает возможность использовать как глобальные миддлвары, так и миддлвары конкретно для контроллера.
Следование стандарту позволяет вам поставить любую известную вам миддлвару и использовать ее вместе с этим пакетом. Он (пакет) перехватывает событие
Преимущества по сравнению с событиями:
- Следование стандарту psr-15;
- Возможность объединять миддлвары в группы;
- Возможность точечно поставить миддлвары над конкретным контроллером;
- Возможность из коробки запускать миддлвары в зависимости от условия (например, в дебаг режиме запустить миддлвару, включающую логирование sql запросов, а в прод режиме – не запускать).
Также автор собирается добавить поддержку аргументов в миддлварах, чтобы можно было динамически указывать специфические для каждого из контроллеров аргументы.
Основная беда Symfony – она предоставляет богатые возможности для решения многочисленных сложных проблем, но с помощью нее сложно решать простые задачи. Например, возьмем миддлвары. Достаточно простой и удобный механизм, упрощающий написание http-обработчиков. Для миддлвар даже придумали стандарт в php-fig.
С помощью миддлвар можно подготавливать запрос, ограничивать доступ, декорировать запрос и ответ для логирования, обработки ошибок и многое другое. Сейчас миддлвары можно имитировать с помощью событий ядра, однако это неудобно, так как приходится помнить о приоритете выполнения слушателей, и неявно, потому что непонятно, какой именно слушатель перехватил запрос.
В Laravel, например, есть миддлвары, хоть и не следующие стандарту psr-15. Можно ли такое сделать в Symfony? Оказывается, можно. Есть такой пакет, который реализует psr-15 и дает возможность использовать как глобальные миддлвары, так и миддлвары конкретно для контроллера.
Следование стандарту позволяет вам поставить любую известную вам миддлвару и использовать ее вместе с этим пакетом. Он (пакет) перехватывает событие
ControllerArgumentsEvent
, на этапе которого уже известен и контроллер, и его аргументы. Пакет проверяет, нужно ли запускать какие-то миддлвары – глобальыне и/или локальные – и запускает их до выполнения контроллера. Преимущества по сравнению с событиями:
- Следование стандарту psr-15;
- Возможность объединять миддлвары в группы;
- Возможность точечно поставить миддлвары над конкретным контроллером;
- Возможность из коробки запускать миддлвары в зависимости от условия (например, в дебаг режиме запустить миддлвару, включающую логирование sql запросов, а в прод режиме – не запускать).
Также автор собирается добавить поддержку аргументов в миддлварах, чтобы можно было динамически указывать специфические для каждого из контроллеров аргументы.
www.php-fig.org
PSR-15: HTTP Server Request Handlers - PHP-FIG
We're a group of established PHP projects whose goal is to talk about commonalities between our projects and find ways we can work better together.
👍13🔥5💩3❤2
#advanced
Один из хардкорных способов избавиться от класса, используемого по всему проекту, при рефакторинге — это убрать его из автозагрузки и под тем же неймспейсом загрузить другой. На эту тему есть плагины для композера, но что если это можно сделать и без них? Автор статьи подробно рассказывает, как этого можно добиться нативными средствами пакетного менеджера.
https://downing.tech/posts/overriding-vendor-classes
Один из хардкорных способов избавиться от класса, используемого по всему проекту, при рефакторинге — это убрать его из автозагрузки и под тем же неймспейсом загрузить другой. На эту тему есть плагины для композера, но что если это можно сделать и без них? Автор статьи подробно рассказывает, как этого можно добиться нативными средствами пакетного менеджера.
https://downing.tech/posts/overriding-vendor-classes
SQL Performance Explained.pdf
1.2 MB
#advacned #sql
Мастрид для разработчиков, которые хотят усовершенствовать навыки при работе с SQL. Книга покрывает обзор множества известных БД.
Мастрид для разработчиков, которые хотят усовершенствовать навыки при работе с SQL. Книга покрывает обзор множества известных БД.
👍10
#advanced #phpstan
Интересный плагин для phpstan, который помогает находить несоответствия между вашей доменной моделью и схемой в базе. Статический анализ вышел на новый уровень 💪.
https://github.com/staabm/phpstan-dba
Интересный плагин для phpstan, который помогает находить несоответствия между вашей доменной моделью и схемой в базе. Статический анализ вышел на новый уровень 💪.
https://github.com/staabm/phpstan-dba
GitHub
GitHub - staabm/phpstan-dba: PHPStan based SQL static analysis and type inference for the database access layer
PHPStan based SQL static analysis and type inference for the database access layer - staabm/phpstan-dba
🔥9
Кто что использует для трейсинга в PHP приложениях?
Anonymous Poll
33%
jaegertracing
31%
opentracing
39%
Свой вариант (напишу в комментариях(
Какие знания нужны, чтобы стать тимлидом?
AGIMA и GeekBrains ответят на этот вопрос в рамках нового потока курса для будущих тимлидов. Здесь вы узнаете, как:
— работать с архитектурой проекта и техническим долгом;
— вести документацию и масштабировать процессы;
— автоматизировать циклы разработки;
— организовывать работу с репозиториями;
— подбирать людей в коллектив;
— понимать продукт и обеспечивать его качество;
— грамотно администрировать проекты и так далее.
Преподаватели будут много говорить о Soft Skills и на примерах из своей жизни расскажут, как общаться с командой, какие личные качества в этом помогут, а какие задушат любую идею.
Регистрируйтесь по ссылке: https://clck.ru/ZRtj3
AGIMA и GeekBrains ответят на этот вопрос в рамках нового потока курса для будущих тимлидов. Здесь вы узнаете, как:
— работать с архитектурой проекта и техническим долгом;
— вести документацию и масштабировать процессы;
— автоматизировать циклы разработки;
— организовывать работу с репозиториями;
— подбирать людей в коллектив;
— понимать продукт и обеспечивать его качество;
— грамотно администрировать проекты и так далее.
Преподаватели будут много говорить о Soft Skills и на примерах из своей жизни расскажут, как общаться с командой, какие личные качества в этом помогут, а какие задушат любую идею.
Регистрируйтесь по ссылке: https://clck.ru/ZRtj3
Простой рабочий алгоритм использования SOLID на практике
Зачем нужны SOLID принципы? Что нужно сделать с множеством сущностей, чтобы код удовлетворял DIP?
🚀Расскажет завтра Евгений Тюменцев, профессионально занимающийся разработкой многопоточных кросс-платформенных приложений на С++, Директор компании по разработке программного обеспечения «Hello World! Technologies».
🚀Всем участникам будет доступна запись вебинара и презентация спикера. Главное, чтобы вы были зарегистрированы на сайте.
Зачем нужны SOLID принципы? Что нужно сделать с множеством сущностей, чтобы код удовлетворял DIP?
🚀Расскажет завтра Евгений Тюменцев, профессионально занимающийся разработкой многопоточных кросс-платформенных приложений на С++, Директор компании по разработке программного обеспечения «Hello World! Technologies».
🚀Всем участникам будет доступна запись вебинара и презентация спикера. Главное, чтобы вы были зарегистрированы на сайте.
👍4👎4
Простой алгоритм использования SOLID на практике
Зачем нужны SOLID принципы? Что нужно сделать с множеством сущностей, чтобы код удовлетворял DIP?
Рассказывает Евгений Тюменцев, профессионально занимающийся разработкой многопоточных кросс-платформенных приложений на С++, Директор компании по разработке программного обеспечения «Hello World! Technologies».
https://youtu.be/H2Lk3SQWhnc
Зачем нужны SOLID принципы? Что нужно сделать с множеством сущностей, чтобы код удовлетворял DIP?
Рассказывает Евгений Тюменцев, профессионально занимающийся разработкой многопоточных кросс-платформенных приложений на С++, Директор компании по разработке программного обеспечения «Hello World! Technologies».
https://youtu.be/H2Lk3SQWhnc
YouTube
Простой алгоритм использования SOLID на практике
Зачем нужны SOLID принципы? Что нужно сделать с множеством сущностей, чтобы код удовлетворял DIP?
Рассказывает Евгений Тюменцев, профессионально занимающийся разработкой многопоточных кросс-платформенных приложений на С++, Директор компании по разработке…
Рассказывает Евгений Тюменцев, профессионально занимающийся разработкой многопоточных кросс-платформенных приложений на С++, Директор компании по разработке…
👍1👎1
#advanced
Надёжный механизм публикации событий с использованием паттерна «transactional outbox».
https://blog.frankdejonge.nl/reliable-event-dispatching-using-a-transactional-outbox/
Надёжный механизм публикации событий с использованием паттерна «transactional outbox».
https://blog.frankdejonge.nl/reliable-event-dispatching-using-a-transactional-outbox/
Frank on Software
Reliable event dispatching using a transactional outbox
Using events in a system is great, but how do you know for sure if you've
reliably dispatched your events? The transportation of events needs to be done
reliably while maintaining overall system consistency, be it eventual or
immediately. In a typical setup…
reliably dispatched your events? The transportation of events needs to be done
reliably while maintaining overall system consistency, be it eventual or
immediately. In a typical setup…
🔥3👍1
#advanced
Значения latency, которые должен знать каждый программист.
https://gist.github.com/hellerbarde/2843375
Значения latency, которые должен знать каждый программист.
https://gist.github.com/hellerbarde/2843375
Gist
Latency numbers every programmer should know
Latency numbers every programmer should know. GitHub Gist: instantly share code, notes, and snippets.
👍6
#funny
Кто там не верил, что PHP — это самый современный язык программирования?! Не показывайте им это.
https://twitter.com/sasha_goebbels/status/1484658646332149762
Кто там не верил, что PHP — это самый современный язык программирования?! Не показывайте им это.
https://twitter.com/sasha_goebbels/status/1484658646332149762
Twitter
Dr. Sasha Volker Göbbels 🏳️⚧️⚗️📚
Me at the PHP Conference, how it started (2003) and how it's going (2021)
👎13💩7👍2😁1
#beginner #video
Теория и примеры SQL инъекций, а также способы защититься от них в новом видео от Евгения Кувшинова.
https://www.youtube.com/watch?v=a8tEQmY3jZY
Теория и примеры SQL инъекций, а также способы защититься от них в новом видео от Евгения Кувшинова.
https://www.youtube.com/watch?v=a8tEQmY3jZY
YouTube
PHP, PDO SQL Injection #3
SQL Injection минимум который должен знать каждый разработчик код которого работает в production
00:00 Вступление и оглавление
01:06 Определения (теория)
01:45 Чем опасны SQL Injection
03:34 Практический стенд
06:12 Обхода аутедентификации
09:23 Модификации…
00:00 Вступление и оглавление
01:06 Определения (теория)
01:45 Чем опасны SQL Injection
03:34 Практический стенд
06:12 Обхода аутедентификации
09:23 Модификации…
👍4🔥3
#advanced #laravel
Недавно релиз Laravel 9 перенесли с 25-го января на 8-е февраля. Тем не менее, релиз уже совсем скоро и пора бы уже обновляться. В Release Notes представлен практически полный список новых фич будущего релиза:
– С этой версии Laravel будет требовать PHP 8.0;
– Обновлены компоненты Flysystem и Symfony Mailer;
– Улучшены акссесоры;
– В аргументах роута можно использовать енамы;
– Группировка роутов по контроллеру;
– Енамы в качестве кастов атрибутов моделей (доступно только для PHP 8.1+);
– Поддержка индексов для полнтекстового поиска;
– И много других мелких изменений.
https://laravel.com/docs/master/releases
Недавно релиз Laravel 9 перенесли с 25-го января на 8-е февраля. Тем не менее, релиз уже совсем скоро и пора бы уже обновляться. В Release Notes представлен практически полный список новых фич будущего релиза:
– С этой версии Laravel будет требовать PHP 8.0;
– Обновлены компоненты Flysystem и Symfony Mailer;
– Улучшены акссесоры;
– В аргументах роута можно использовать енамы;
– Группировка роутов по контроллеру;
– Енамы в качестве кастов атрибутов моделей (доступно только для PHP 8.1+);
– Поддержка индексов для полнтекстового поиска;
– И много других мелких изменений.
https://laravel.com/docs/master/releases
👍5
#worker
Когда вы пишете долгоживущие (синхронные) воркеры, возникает необходимость следить за таймаутом задач, иначе одна задача может выполняться очень долго, заблокировав весь воркер. Это могут быть долгие вызовы по сети, особенно если вы не используете таймауты при http запросах, продолжительные вычисления, парсинг файлов и так далее.
Что можно с этим сделать? Например, использовать сигналы. Для этого вам потребуется расширение
Разберем, что здесь происходит:
1. Включаем асинхронную обработку сигналов, так как синхронно сигнал вы не получите, если воркер будет заблокирован:
2. Задаем таймер для сигнала
3. Устанавливаем обработчик данного сигнала:
4. Запускаем долгую задачу.
5. Сбрасываем обработчик сигнала:
Теперь каждая ваша задача не может выполняться дольше, чем 3 секунды.
На тему обработки сигналов есть хорошая библиотека от автора монолога, которая позволяет обрабатывать любые сигналы, отправленные процессу, и как-то на них реагировать.
Когда вы пишете долгоживущие (синхронные) воркеры, возникает необходимость следить за таймаутом задач, иначе одна задача может выполняться очень долго, заблокировав весь воркер. Это могут быть долгие вызовы по сети, особенно если вы не используете таймауты при http запросах, продолжительные вычисления, парсинг файлов и так далее.
Что можно с этим сделать? Например, использовать сигналы. Для этого вам потребуется расширение
pcntl
:pcntl_async_signals(true);
while (1) {
pcntl_alarm(3);
pcntl_signal(SIGALRM, function (): void {
throw new RuntimeException();
});
doWork(); // running too slow task.
pcntl_alarm(0);
}
Разберем, что здесь происходит:
1. Включаем асинхронную обработку сигналов, так как синхронно сигнал вы не получите, если воркер будет заблокирован:
pcntl_async_signals(true);
2. Задаем таймер для сигнала
SIGALRM
, которые будет отправлен текущему процессу через 3 секунды:pcntl_alarm(3);
3. Устанавливаем обработчик данного сигнала:
pcntl_signal(SIGALRM, function (): void {
throw new RuntimeException();
});
4. Запускаем долгую задачу.
5. Сбрасываем обработчик сигнала:
pcntl_alarm(0);
Теперь каждая ваша задача не может выполняться дольше, чем 3 секунды.
На тему обработки сигналов есть хорошая библиотека от автора монолога, которая позволяет обрабатывать любые сигналы, отправленные процессу, и как-то на них реагировать.
GitHub
GitHub - Seldaek/signal-handler: Simple unix signal handler that silently fails on windows for easy cross-platform development
Simple unix signal handler that silently fails on windows for easy cross-platform development - Seldaek/signal-handler
👍22
Привет! «Библиотека программиста» проводит анонимный опрос по теме: «Как вы управляете своими финансами?» Опрос займет не более 3 минут вашего времени.
Пройти его можно по ссылке
Пройти его можно по ссылке
💩7👍2
#worker
По следам вчерашней публикации.
Оказалось, такой сигнал, к сожалению, не сможет прервать выполнение кода, если выполняется какой-нибудь длительный запрос через
Решение для
Для
Спасибо @the_toster за ссылку.
По следам вчерашней публикации.
Оказалось, такой сигнал, к сожалению, не сможет прервать выполнение кода, если выполняется какой-нибудь длительный запрос через
file_get_contents
, curl
, etc. Решение для
curl
можно найти на stackoverflow. Для
file_get_contents
можно использовать контекст:$ctx = stream_context_create(['http'=> ['timeout' => 3]]);
echo file_get_contents(filename: 'https://example.com/', context: $ctx);
Спасибо @the_toster за ссылку.
Telegram
Библиотека пхпшника
#worker
Когда вы пишете долгоживущие (синхронные) воркеры, возникает необходимость следить за таймаутом задач, иначе одна задача может выполняться очень долго, заблокировав весь воркер. Это могут быть долгие вызовы по сети, особенно если вы не используете…
Когда вы пишете долгоживущие (синхронные) воркеры, возникает необходимость следить за таймаутом задач, иначе одна задача может выполняться очень долго, заблокировав весь воркер. Это могут быть долгие вызовы по сети, особенно если вы не используете…
👍12
#advanced #video #spiral
Новости от команды фреймворка Spiral.
https://www.youtube.com/watch?v=VIoGqpn3eyc
Новости от команды фреймворка Spiral.
https://www.youtube.com/watch?v=VIoGqpn3eyc
YouTube
Spiral Ecosystem news #2
После каждого релиза R&D команда Spiral собирается, чтобы обсудить новые фичи вошедшие в релизы наших проектов, а так-же последние новости по Roadrunner, Cycle ORM и Spiral Framework.
👍5
#advanced
Разбираемся, почему
https://www.exakat.io/en/speeding-up-array_merge/
Разбираемся, почему
array_merge
может быть медленным и что можно с этим сделать.https://www.exakat.io/en/speeding-up-array_merge/
👍1