Возвращаем Redis в Mercure и немного о static-php-cli
Как преодолеть узкие места масштабируемости Mercure HUB, заменив BoltDB на Redis, а так же собрать свою статическую сборку php сервера вместе с Caddy, Mercure, FrankenPHP

Скриптовый язык общего назначения
Как преодолеть узкие места масштабируемости Mercure HUB, заменив BoltDB на Redis, а так же собрать свою статическую сборку php сервера вместе с Caddy, Mercure, FrankenPHP

В этой статье я хочу поделиться своим опытом настройки WSL для комфортной разработки, а также размышлениями о том, почему такой подход оказался для меня оптимальным. На это влияет несколько факторов.
Во-первых, иногда требуется специфический софт, который доступен только под Windows. Да, в других ОС могут быть аналоги, но зачастую они менее удобны или требуют дополнительной настройки.
Во-вторых, для разных проектов нужно разное окружение. WSL позволяет легко изолировать среды разработки, настраивая их под конкретные задачи или группы проектов. Это гораздо удобнее, чем держать несколько физических машин или постоянно переустанавливать систему.
Наконец, есть и субъективный фактор — привычка. Я с самого начала работал с Windows, и, несмотря на все преимущества Linux, полностью перестроить рабочий процесс оказалось сложно. WSL в этом плане — идеальный компромисс: Linux-окружение под рукой, но без необходимости отказываться от удобств Windows.
К написанию этой статьи меня подтолкнуло изучение архитектурных подходов для Vue.js-проектов, а вдохновила - детально описанная методология Feature-Sliced Design.
К сожалению, PHP-сообществу не хватает подобных развернутых рекомендаций, да и вообще, каких-то общепризнанных стандартных подходов в структуре проекта.
Моя статья - это попытка обобщить изученную мною за много лет информацию и сформировать универсальную структуру проекта, основанную на принципах Clean Architecture и модульного монолита.

Привет, Хабр!
Сегодня рассмотрим одну из самых сильных сторон Symfony — компонент EventDispatcher.
Если очень кратко, EventDispatcher позволяет создавать реактивную архитектуру: одни части приложения инициируют события, другие на них реагируют, не зная напрямую друг о друге.

Привет, Хабр!
Месяц назад я выложил в открытый доступ проект бота для технической поддержки. За это время он собрал более 100 клонирований и 40+ звёзд на GitHub. В Issues начали появляться предложения по доработкам — большое спасибо всем, кто откликнулся. Это дало мощную мотивацию развивать проект дальше.
GitHub - https://github.com/prog-time/tg-support-bot
В этом посте — кратко о ключевых изменениях последнего релиза.

Хотим поделиться опытом разработки эффективного поиска для одного интересного проекта. Мы подробно рассмотрим, как сделали поиск удобным, быстрым и привлекательным для пользователей, увеличив конверсию на 27% всего лишь за счет грамотной настройки Elasticsearch.
Немного предыстории: автор гораздо больше аналитик, дизайнер и системный инженер, чем программист. Однако, несколько Интернет-магизонов когда-то "от корки до корки" сделал. А теперь замутил небольшой хобби-проект на Atmega. Ничего особенного, цветомузыка очередная. И вот, разбираясь с этой штукой, а также общаясь с коллегами, которые реально серьезные программеры, набрел на такую вот мысль...

Статья-практикум показывает, как устроены HTTP/2, HTTP/3 (QUIC) и gRPC на самом низком уровне. Вместо толстых библиотек мы пишем минимальный учебный фреймворк «Mini-Transport» на Rust (~600 строк): реализуем кодек HTTP/2-фреймов, упрощённый gRPC-протокол и базовую обёртку над QUIC. В результате получаем рабочий echo-клиент и сервер, которые пересылают «hello ↔ world» через собственноручно собранные фреймы. Разбор сопровождается поясняющими схемами, ссылками на RFC, вариантами дальнейшего развития (HPACK, flow-control, TLS/ALPN) и готовым репозиторием для самостоятельных экспериментов. Материал рассчитан на разработчиков, желающих понять «как всё крутится под капотом» и прокачать навыки низкоуровневой сетевой работы в Rust.

Массовая генерация разделов для таксономии в WP через массив и команду wp-cli.
Прикольная штука вроде, удобная.

В языке Go одним из важнейших преимуществ является мощная поддержка многопоточности и параллелизма за счёт горутин и каналов. В этой статье подробно разберём три продвинутых шаблона работы с горутинами:

Сегодня поговорим о том, как внедрить метрики в формате OpenTelemetry в PHP монолит, построенный на фреймворке Yii2.
Спойлер: как оказалось, на этой задаче можно пару раз разочароваться в бытии разработчика сломать голову на способе сбора, отправке, промежуточных звеньях и сломанных гистограммах.

defer в Go — это мощный механизм для очистки ресурсов, закрытия файлов и разблокировки мьютексов. Вы наверняка слышали, что defer делает код чище и безопаснее.
Когда вы открываете файл через os.Open() или os.Create(), Go выделяет ресурс операционной системы — дескриптор файла.

Наверняка каждый php-разработчик, хоть раз сталкивавшийся с чтением или записью Excel-файлов, знает про библиотеку PhpSpreadsheet (в прошлом - PHPExcel). Это мощная библиотека на чистом php, которая позволяет читать, а, главное, создавать Excel-таблицы. И все с ней хорошо, пока работаешь с небольшим набором данных. Но при работе с большими файлами PhpSpreadsheet начинает чудовищно отжирать память, да и производительность резко падает, и php-скрипт, использующий библиотеку, часто просто отваливается по таймауту. И проблема - в архитектуре библиотеки.
Библиотека PhpSpreadsheet, казалось бы, спроектирована очень правильно: листы таблицы, строки, ячейки, прочие сущности - это все классы, стили, форматы и всевозможные свойства тоже состоят из классов. И когда создается таблица, то в памяти создается огромное количество связанных между собой объектов, им задаются свойства, выполняются всевозможные манипуляции, ячейки заполняются данными, всё-всё это держится в памяти, и пишется в файл только в момент сохранения.
И вот однажды, когда ресурсы на генерацию большого Excel-файла превысили все разумные значения, я начал искать альтернативу известной библиотеке. Альтернатива нашлась. В отличие от PhpSpreadsheet, тут все было упаковано в один класс, возможности по форматированию и стилям - скромнее некуда, но зато XLSX-файл создавался в разы быстрее, а потребление памяти было вообще копеечное. А все потому, что тут был реализован совсем иной принцип - данные не накапливались в памяти, а построчно сразу выводились в файл. Вдохновившись этой идеей, я и создал свою библиотеку FastExcelWriter.
Сегодня затронем такую неожиданную тему как работу с брокером сообщений Nats на PHP. Как оказалось, есть очень мало статей на эту тему, так что попробуем с этим разобраться и реализовать базовую работу с очередью.

На вашем сайте, внутреннем портале, в интернет-магазине кто-то что-то сделал, а потом всё сломалось: сайт открывается криво (или не открывается вообще?), перестали работать фоновые задачи в планировщике, установились неправильные скидки всем пользователям на все товары... Предположим, что с безопасностью у вас всё хорошо: Joomla свежая, актуальная, расширения - тоже. Да и в логах сервера и логах Joomla тоже чисто... Тогда остаётся ещё один источник информации - Лог действий пользователей Joomla. Основная его задача - помочь быстро найти кому настучать по рогам причину и устранить её.
Всё, что связано с действиями в админке - может логироваться: от обновления системы и компонентов, изменения настроек до редактирования и сохранения конкретных элементов (статьи, товары, категории и т.д.) и загрузки файлов в медиа менеджере. Лично мне нередко этот функционал помогал найти тех контент-менеджеров, кто дублирует названия товаров, создавая дубли и тем самым негативно влияя на SEO. Или же вдруг обнаруживается недозаполненная, но опубликованная карточка товара, которой не должно было быть, но она появилась. И ладно если б это был единичный случай...

В этой статье я подготовил для вас прототип CRUD-приложения, которое использует файберы и неблокирующие(асинхронные) возможности драйвера PostreSQL. Вместе они дают любопытные результаты по производительности и потреблению памяти.
На работе была поставлена задача: в главное веб-приложение нашей фирмы добавить метод формирования бланка в формате PDF «как вот в том микросервисе».
Форма бланка регулярно изменяется, и копировать её в веб-приложение означало нарушить принцип DRY («Не повторяйся») и обречь себя на постоянную двойную работу. Поэтому я решил оставить генерацию бланка в «том микросервисе».
«Тот микросервис» написан на PHP с использованием фреймворка Laravel, содержит большое число доменных объектов, экземпляры которых хранятся в БД MySQL, и имеет развитую систему API для обращения к своему функционалу.
И можно было добавить в него ещё одну точку доступа API, которая бы получала данные и на их основе формировала и возвращала бланк.
Проблема возникла из-за «неприлично» высокой связанности объектов в «том микросервисе». Так, в шаблоне, на основе которого строился бланк, использовались не просто примитивные типы данных, а объект-форма. И шаблон обращался к методам-геттерам этого объекта. А объект, в свою очередь, использовал другой доменный объект в своём конструкторе для заполнения полей.

Свою первую работу программистом на языке PHP я нашёл в далёком 2011 году, имел опыт с разными версиями языка от 5.0 до 8.1 в коммерческих разработках. C тех пор иногда приходилось выходить в смежные области: Python, NodeJS, 1С, VBA и вот наконец Go. Для любого опытного профессионала не станет откровением, что одну и ту же вещь можно сделать разными средствами, и что для каждой задачи есть свой наиболее подходящий инструмент. В середине 2010-х особое распространение начинают получать такие направления, как High Load, микросервисная архитектура, и конечно модное тогда распиливание монолитов. Многие из проектов-монолитов были написаны на языке PHP, и из тех, кто стал делать первые шаги в Go в то время стали в том числе те самые программисты, которые с блеском в глазах могли, как мантру повторять «распилить монолит» и мечтать написать микросервис на Go под каждую задачу, требующей всего того, на что привычный PHP был не способен: неэффективный расход памяти, отсутствие асинхронности.
И в принципе, до выхода версии 7.4 с ее возможностью FFI (Foreign Function Interface) решить озвученные выше проблемы мог совсем не каждый программист, занимающийся разработкой "коробочной" CMS (WordPress, Drupal, Joomla! или Битрикс). В конце концов, мало кому хотелось, вспоминать полузабытый после университета язык C, браться за разработку собственного расширения для PHP (pecl).
Сказанное выше является моим субъективным мнением, единственным выводом из которых хотелось выделить одну простую мысль - есть некая аудитория программистов, которые знают и Go, и PHP. Если вы набрели на эту статью, вбив в поисковике слова "PHP FFI Go", то эта статья для вас, тех кто ищет нетривиальные пути, тех кто пытается взять лучшее от каждой из технологий.

Привет, Хабр!
Представляю вашему вниманию подробное пошаговое руководство по настройке аутентификации на основе cookies с помощью Laravel Sanctum. В процессе мы объясним логику каждого шага и покажем, как настроить Postman. Кроме того, мы рассмотрим наиболее распространенные проблемы, связанные с CORS.

Всех привествую, меня зовут Денис, я PHP Backend разрботчик
Я выступаю на хакатонах за команду https://жыбийрыр.рф/ и у нас была проблема что не было шаблона с которым мы могли спокойно приходить на хакатоны и не писать один и тот же код из раза в раз
Данная статья будет посвещена о том как я писал данный шаблон, с какими проблемами столкнулся и чему смог научиться