PHP Fart Time
1.78K subscribers
90 photos
4 videos
2 files
183 links
Привет, фартаны!

Дурачимся, пилим OpenSource и рассказываем про пердовые технологии в php.

Авторы контента: @roxblnfk и @butschster
Download Telegram
Forwarded from Pavel Buchnev
Всем любителям temporal привет. Антон на досуге написал статью по обработке очереди задач с Temporal.

Подготовил перевод для тех, кто не хочет напрягать мозг https://gist.github.com/butschster/2af0b06f693ec615ce55e0c2d4131e53

Оригинал https://spiralscout.com/blog/leveraging-temporal-for-efficient-document-life-cycle-management для тех, кому не нравится перевод ChatGPT )
10🔥64
Forwarded from Pavel Buchnev
Всем привет! В 21:00 по МСК будет очередной стрим по разработке микросервисной архитектуры на PHP и gRPC. https://youtube.com/live/DJEh8pa7KO4

📌 Основные темы:
- Авторизация пользователя в web сервисе
- Передача авторизационного токена между сервисами (Интерсепторы)
- Обсуждение темы ограничения доступа к определённым эндпоинтам с настройкой прав доступа
- Лайфхаки по работе с инфраструктурой

Жду всех на стрим. Не забывайте про лайки.
🔥176
Не пропустите эксклюзивное интервью с Антоном Давыдовым, ведущим солюшн-архитектором!

🚀 Погрузимся в мир профессионального роста. Обсудим перспективы карьеры после достижения статуса Senior Developer.
💡 Поговорим о роли солюшн-архитектора: что это за специальность, каковы её ключевые задачи и какие навыки необходимы для успеха в этой роли.
🍺 Посидим-попердим. Да и просто нормально проведем время.

⚠️ Закидывайте вопросы в тред, постараемся задать их Антону. А то свои мы так и не подготовили (как обычно).
🔥11💩33
ℹ️ На нашем прошлом стриме Антон рассказал про свой курс анализа систем, на котором учат проектировать системы и распиливать монолиты.

Ссылка на курс: https://tough-dev.school/system-analysis
Стартует уже скоро, 13 июня.
Это 4-недельный курс о том, как проектировать системы, как новые (чтобы потом не переделывать), так и старые (чтобы разобрать на части и ускорить разработку); как распиливать монолиты, обоснованно выбирать технологии и архитектурные стили, оставляя после себя понятную документацию. DDD, EventSourcing, Микросервисы и т.д., все эти модные слова будут частью этого курса.
Детальная информация на сайте.


🔥 Для фартанов есть промокод на скидку в 10% (до 13 июня): fart10

TG канал Антона: ☕️ pepegramming
Грустно об архитектуре и программировании


Список книг, использованных при создании курса:

Learning Domain-Driven Design
Implementing Domain-Driven Design
Introducing EventStorming
Fundamentals of Software Architecture
Software Architecture: The Hard Parts
Solutions Architect's Handbook
Software Architecture in Practice
Building Microservices
Software Systems Architecture
System Architecture
Monolith to Microservices
Analysis Patterns
Building Evolutionary Architectures
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥84
Сегодня в 21:00 по МСК проводим стрим по профилированию PHP приложений и о том как искать медленный код (Bottlenecks) на примере Laravel и Spiral Framework + Buggregator.

Мы подготовим PHP приложение к запуску с xhprof, сбору профилей и отправки их в Buggregator для анализа. Заодно посмотрим как вообще запускать профайлер, какую информацию он отдает, как ее интерпретировать и т.д. и т.п.

Не пропустите, будет интересно
https://youtube.com/live/CU6gCj5UU84?feature=share
🔥2244
Очередной упоротый обзор всякой фигни вокруг PHP с жиром и шутками 🚽
https://telegra.ph/V-mire-PHP-2-06-05

Зеркало на Notion, если телеграф опять все ссылки поломает.

⬆️ предыдущая часть

#Article #PHP #МыслиВслух

ℹ️ Если в конце статьи нет ссылки на следующую часть, то статья в телеге подгрузилась не полностью. В этом случае можно открыть в браузере.
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥5295💩2
Всем привет!
🕘 В 21:00 по МСК проведем очередной стрим для любителей RoadRunner, а также для тех, кто слыхал что-то про него, но не понимает зачем оно нужно. 💩

🚀 В стриме будем обсуждать как вдохнуть новую жизнь в монолит на PHP с помощью очередей RoadRunner.

😎 Наш гость, активный контрибьютор в RoadRunner, Владимир Плахотников (@embargo2710)

🧨 Обсудим:
- Проблемы старых демонов: что с ними не так и как RoadRunner делает жизнь лучше.
- Почему RoadRunner? Минимум технических сравнений, только суть.
- Истории из траншеи: как я начал учить Go и не прогадал.
- Обсудим критические ошибки и мелкие фишки, которые мы добавили.
- Итоги внедрения: что у нас получилось и как это помогло.
- Что дальше? Готовимся к HTTP-запросам!

не забудь про лайк и подписку на канал, мы их каждый день пересчитываем и складываем в копилку 🐷

https://www.youtube.com/live/otFglUGsSi0"
🔥189
Всем привет!

🕘 В 21:00 по МСК проведем очередной стрим для самых маленьких, кому хочется RoadRunner, но он не понимает зачем.

😎 Часто слышу отзывы по RoadRunner, мол мы много говорим про него, какой он крутой и т.д., но оказывается мало кто понимает что это такое, как он работает и зачем он вообще нужен для нашего PHP приложения. Я решил, что пора нам уже с ним познакомиться, настроить, запустить, посмотреть как он работает, как взаимодействует с PHP и бежать устанавливать в свой проект.

Сегодня мы это исправим!

Что нас ждёт:

- Разберёмся, в чем разница между работой приложения без RoadRunner и с ним.
- Установим RoadRunner.
- Изучим конфигурацию и подготовим всё к работе.
- Посмотрим, как PHP-приложение обменивается данными с RoadRunner на примере HTTP и Jobs плагинов.
- Изучим основные возможности RoadRunner.
- Узнаем, что такое RPC-протокол и зачем он нужен.
- Ответим на ваши вопросы.

https://www.youtube.com/live/qnl51Hl44kw
🔥308😁3💊32
Всем привет!

🕘 В 21:00 по МСК проведем очередной стрим для самых маленьких, кому хочется научиться создавать масштабируемый Workflow с Temporal

Не пропустите наш предстоящий стрим, где мы подробно разберем пример реализации Workflow для регистрации пользователя с использованием Temporal!

В этом стриме мы покажем, как можно эффективно управлять сложным процессом регистрации, включающим несколько обязательных этапов:

- Прохождение KYC для подтверждения личности.
- Верификация Email адреса, чтобы убедиться, что пользователь действительно владеет указанным email.
- Выбор тарифного плана, который определяет уровень доступа и функциональности, доступные пользователю.

Мы также рассмотрим, как в рамках Workflow происходит смена статусов и отправка уведомлений пользователю, что делает процесс регистрации максимально автоматизированным и прозрачным.

Может показаться, что все эти процессы можно реализовать и без использования Workflow, но мы покажем, как использование Temporal позволяет не только оптимизировать и упорядочить каждый шаг, но и гарантировать выполнение всех процессов в правильном порядке и с нужной синхронизацией. Это особенно важно для сервисов, требующих высокого уровня безопасности и надежности при регистрации пользователей.

Присоединяйтесь к нам, чтобы узнать, как с помощью Temporal можно повысить эффективность и безопасность регистрационных процессов!

https://youtube.com/live/QhXpI9rVnN8?feature=share
🔥19103
Вчера была днюха. Моя женщина подарила охуенный торт! Всех с днюхами!
🔥5827😁177
Привет 👋
Делюсь апдейтами #PackageNews
Последние пару недель хакинга были довольно продуктивными.
Запустил в альфу два новых пакетов и одну мажорную версию:

👩‍💻 internal/dload — утилита, скачивающая бинари.
Удобно тем, что можно закинуть в композер на событие post-update и бинари будут подгружаться вместе с зависимостями.
  "scripts": {  
"post-update-cmd": [
"dload get rr --no-interaction",
"dload get temporal --no-interaction"
],

Уже загружаю таким образом RoadRunner, Dolt, Temporal (CLI и Test) и protoc с PHP плагином.
К полноценному релизу надо покрыть тестами и навесить пару оптимизирующих фичей.

👩‍💻 spiral/grpc-client — обвязка для клиента gRPC. Эта ответственность вынесена в отдельный пакет из spiral/roadrunner-bridge. Теперь нет необходимости генерировать замудрёные классы, т.к. всё генерится само на лету (достаточно интерфейса). Больше контроля и поведений благодаря интерцепторам: ротация коннекшенов, гибкие ретраи, таймауты и всё, что угодно.
Для стабильной версии не хватает тестов.

👩‍💻 spiral/roadrunner-bridge — новая мажорная версия интеграции Spiral с RoadRunner. Оптимизации, зачистки и новые концепты из будущих версий Spiral.
Для стабильного релиза не хватает релиза Spiral 3.14 и небольшой полировки.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥28
А продуктивно хакать мне помогал Copilot.
Да, да, он бывает полезным!

Вот, например, ситуация: кот наступил на клавиатуру и набрейнфачил прямо среди PHP кода 😼
Как не завалить проверку кота при том, что вы совсем не знаете brainfuck?
Не расстраивайтесь, ведь именно здесь то нейросеть и раскроет свой потенциал. Подождите секундочку, пока llm сгенерит продолжение, и останется только нажать tab, чтобы утвердить своё превосходство 😠

Ну, а если Copilot не знает, что предложить, то хотя бы честно (пусть и грубо) об этом скажет.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
😁40🤮2
Пакет 👩‍💻 phplrt/phplrt несомненно хорош! Спасибо @SerafimArts за крутой инструмент!

Что бы вы сделали, будь у вас AST для proto message? Я бы, например, только в нем схемы и описывал 😁

final class MessageDefNodeTest extends TestCase
{
public function testParse(): void
{
$node = $this->parser->parse(
<<<'PROTO'
syntax = "proto3";

package example;

message Person {
string name = 1;
int32 id = 2;
string email = 3;
}
PROTO,
);

$this->assertSame('proto3', $node->syntax->syntax);
$this->assertSame('example', $node->package->name);

$message = $node->topLevelDefs[0];

$this->assertSame('Person', $message->name);
$this->assertCount(3, $message->fields);

$this->assertSame('name', $message->fields[0]->name);
$this->assertSame('string', $message->fields[0]->type);
$this->assertSame(1, $message->fields[0]->number);

$this->assertSame('id', $message->fields[1]->name);
$this->assertSame('int32', $message->fields[1]->type);
$this->assertSame(2, $message->fields[1]->number);

$this->assertSame('email', $message->fields[2]->name);
$this->assertSame('string', $message->fields[2]->type);
$this->assertSame(3, $message->fields[2]->number);
}
}
Please open Telegram to view this post
VIEW IN TELEGRAM
10🔥3🤔21
Ну что, за два дня готов пакет для построения AST для protobuf 👩‍💻 butschster/proto-parser . Уверен всплывут баги и т.д., но тесты есть, кучу edge кейсов покрыл.

Чем он крут? Можно взять proto-файлы, превратить их в дерево PHP-объектов (AST) и далее сгенерировать свои DTO-классы. Например:

syntax = "proto3";

package examplepb;

message Person {
// Unique identifier for the person.
uint64 id = 1 [(validate.rules).uint64.gt = 999];

// Email address will be used for communication.
string email = 2 [(validate.rules).string.email = true];

// Full name of the person.
string name = 3 [(validate.rules).string = {
pattern: "^[A-Za-z]+( [A-Za-z]+)*$",
max_bytes: 256
}];

// Home location of the person.
Location home = 4 [(validate.rules).message.required = true];

message Location {
double lat = 1 [(validate.rules).double = {gte: -90, lte: 90}];
double lng = 2 [(validate.rules).double = {gte: -180, lte: 180}];
}
}

service ExampleService {
// Create a new person.
rpc CreatePerson(Person) returns (Person) {
option (google.api.http) = {
post: "/v1/persons"
body: "*"
};
}
}


Превратим в:

use Symfony\Component\Validator\Constraints as Assert;

final readonly class Person
{
public function __construct(
/** Unique identifier for the person. */
#[Assert\GreaterThan(value: 999)]
public int $id,
/** Email address will be used for communication. */
#[Assert\Email]
public string $email,
/** Full name of the person. */
#[Assert\Regex(pattern: '^[A-Za-z]+( [A-Za-z]+)*$'), Assert\Length(max: 256, charset: '8bit')]
public string $name,
/** Home location of the person. */
#[Assert\NotNull]
public Location $home,
) {
}
}


use Symfony\Component\Validator\Constraints as Assert;

final readonly class Location
{
public function __construct(
#[Assert\GreaterThanOrEqual(value: -90), Assert\LessThanOrEqual(value: 90)]
public float $lat,
#[Assert\GreaterThanOrEqual(value: -180), Assert\LessThanOrEqual(value: 180)]
public float $lng,
) {
}
}


<?php

declare(strict_types=1);

namespace Internal;

use App\Grpc\Service;
use OpenApi\Annotations as OA;
use Spiral\RoadRunner\GRPC\ContextInterface;

#[Service(name: 'ExampleService', package: 'examplepb')]
interface ExampleServiceInterface
{
/**
* Create a new person.
*/
#[OA\Post(path: '/v1/persons', tags: ['CreatePerson'])]
#[OA\RequestBody(path: '*', tags: ['CreatePerson'])]
public function CreatePerson(ContextInterface $ctx, Person $in): Person;
}




Что умеет:
1. Строить дерево. Понимает весь синтаксис, что я смог найти.
2. Привязывать комментарии к нодам. Например комментарий над полем будет в ноде поля. Комментарий к option будет в его ноде. И т.д.
3. Дока есть.

Что не умеет:
ХЗ что. призываю потестить и улучшить желающих.

Прогнал свой проект с > 100 proto файлов, все спарсил.

P.s. Ах да, забыл сказать, что эти DTO сгененировал мой другой пакет, который уже умеет работать с AST. Сделан на коленке, поэтому еще не выкладывал.
Please open Telegram to view this post
VIEW IN TELEGRAM
3🔥30
Всем привет!

🕘 В 21:00 по МСК проведем очередной стрим для самых маленьких, кому хочется научиться создавать парсер protobuf синтаксиса на PHP с помощью AI

Не пропустите наш предстоящий стрим, где мы подробно разберем В мощный пакет от @SerafimArts - phplrt/phplrt для создания парсеров. Вместе мы напишем парсер для синтаксиса protobuf, который преобразует код в AST (абстрактное синтаксическое дерево). В процессе лайв-кодинга вы узнаете, как использовать AI для упрощения и ускорения разработки, а также получите практические советы по применению AI в программировании. Не пропустите, будет интересно и познавательно!
https://www.youtube.com/watch?v=xyk0sLe8Q9I
514🔥9