Обновить
57.92

PHP *

Скриптовый язык общего назначения

Сначала показывать
Порог рейтинга
Уровень сложности

Linux для начинающих: WSL — это читерство. Как Microsoft дал нам Linux без головной боли

Уровень сложностиПростой
Время на прочтение9 мин
Охват и читатели46K

В этой статье я хочу поделиться своим опытом настройки WSL для комфортной разработки, а также размышлениями о том, почему такой подход оказался для меня оптимальным. На это влияет несколько факторов.

Во-первых, иногда требуется специфический софт, который доступен только под Windows. Да, в других ОС могут быть аналоги, но зачастую они менее удобны или требуют дополнительной настройки.

Во-вторых, для разных проектов нужно разное окружение. WSL позволяет легко изолировать среды разработки, настраивая их под конкретные задачи или группы проектов. Это гораздо удобнее, чем держать несколько физических машин или постоянно переустанавливать систему.

Наконец, есть и субъективный фактор — привычка. Я с самого начала работал с Windows, и, несмотря на все преимущества Linux, полностью перестроить рабочий процесс оказалось сложно. WSL в этом плане — идеальный компромисс: Linux-окружение под рукой, но без необходимости отказываться от удобств Windows.

Читать далее

The Clean Structure — Универсальная структура PHP-проекта на примере Laravel

Уровень сложностиСредний
Время на прочтение12 мин
Охват и читатели6.2K

К написанию этой статьи меня подтолкнуло изучение архитектурных подходов для Vue.js-проектов, а вдохновила - детально описанная методология Feature-Sliced Design.

К сожалению, PHP-сообществу не хватает подобных развернутых рекомендаций, да и вообще, каких-то общепризнанных стандартных подходов в структуре проекта.

Моя статья - это попытка обобщить изученную мною за много лет информацию и сформировать универсальную структуру проекта, основанную на принципах Clean Architecture и модульного монолита.

Читать далее

Как работает EventDispatcher в Symfony

Уровень сложностиПростой
Время на прочтение8 мин
Охват и читатели1.1K

Привет, Хабр!

Сегодня рассмотрим одну из самых сильных сторон Symfony — компонент EventDispatcher.

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

Читать далее

Новый релиз бота технической поддержки: интеграция с ВКонтакте и docker-compose сборка с мониторингом

Уровень сложностиПростой
Время на прочтение2 мин
Охват и читатели713

Привет, Хабр!

Месяц назад я выложил в открытый доступ проект бота для технической поддержки. За это время он собрал более 100 клонирований и 40+ звёзд на GitHub. В Issues начали появляться предложения по доработкам — большое спасибо всем, кто откликнулся. Это дало мощную мотивацию развивать проект дальше.

GitHub - https://github.com/prog-time/tg-support-bot

В этом посте — кратко о ключевых изменениях последнего релиза.

Читать далее

Эффективный поиск с Elasticsearch: как мы повысили конверсию на 27%

Уровень сложностиПростой
Время на прочтение3 мин
Охват и читатели2.2K

Хотим поделиться опытом разработки эффективного поиска для одного интересного проекта. Мы подробно рассмотрим, как сделали поиск удобным, быстрым и привлекательным для пользователей, увеличив конверсию на 27% всего лишь за счет грамотной настройки Elasticsearch.

Читать далее

Концепт-идея: PHP (не совсем, конечно :)) для встраиваемых систем

Время на прочтение2 мин
Охват и читатели2.9K

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

Читать далее

HTTP/2 / HTTP/3 и gRPC на Rust: пишем учебный Mini-Transport

Уровень сложностиСредний
Время на прочтение6 мин
Охват и читатели1.5K

Статья-практикум показывает, как устроены 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-Seeders для Вордпресса

Уровень сложностиПростой
Время на прочтение2 мин
Охват и читатели1.1K

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

Прикольная штука вроде, удобная.

Открыть

Advanced Goroutines Patterns в Go: Fan-out, Fan-in и Pipelines

Уровень сложностиСредний
Время на прочтение7 мин
Охват и читатели2.1K

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

Читать далее

Внедряем метрики OpenTelemetry в PHP проект на Yii2

Уровень сложностиСредний
Время на прочтение10 мин
Охват и читатели1.7K

Сегодня поговорим о том, как внедрить метрики в формате OpenTelemetry в PHP монолит, построенный на фреймворке Yii2.

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

Читать далее

Go defer: что не сказали в книгах

Уровень сложностиПростой
Время на прочтение3 мин
Охват и читатели4.1K

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

Когда вы открываете файл через os.Open() или os.Create(), Go выделяет ресурс операционной системыдескриптор файла.

Читать далее

FastExcelWriter — избавление от проклятия PhpSpreadsheet

Уровень сложностиСредний
Время на прочтение3 мин
Охват и читатели4.7K

Наверняка каждый php-разработчик, хоть раз сталкивавшийся с чтением или записью Excel-файлов, знает про библиотеку PhpSpreadsheet (в прошлом - PHPExcel). Это мощная библиотека на чистом php, которая позволяет читать, а, главное, создавать Excel-таблицы. И все с ней хорошо, пока работаешь с небольшим набором данных. Но при работе с большими файлами PhpSpreadsheet начинает чудовищно отжирать память, да и производительность резко падает, и php-скрипт, использующий библиотеку, часто просто отваливается по таймауту. И проблема - в архитектуре библиотеки.

Библиотека PhpSpreadsheet, казалось бы, спроектирована очень правильно: листы таблицы, строки, ячейки, прочие сущности - это все классы, стили, форматы и всевозможные свойства тоже состоят из классов. И когда создается таблица, то в памяти создается огромное количество связанных между собой объектов, им задаются свойства, выполняются всевозможные манипуляции, ячейки заполняются данными, всё-всё это держится в памяти, и пишется в файл только в момент сохранения.

И вот однажды, когда ресурсы на генерацию большого Excel-файла превысили все разумные значения, я начал искать альтернативу известной библиотеке. Альтернатива нашлась. В отличие от PhpSpreadsheet, тут все было упаковано в один класс, возможности по форматированию и стилям - скромнее некуда, но зато XLSX-файл создавался в разы быстрее, а потребление памяти было вообще копеечное. А все потому, что тут был реализован совсем иной принцип - данные не накапливались в памяти, а построчно сразу выводились в файл. Вдохновившись этой идеей, я и создал свою библиотеку FastExcelWriter.

Читать далее

Работаем с Nats в PHP

Уровень сложностиПростой
Время на прочтение10 мин
Охват и читатели2.1K

Сегодня затронем такую неожиданную тему как работу с брокером сообщений Nats на PHP. Как оказалось, есть очень мало статей на эту тему, так что попробуем с этим разобраться и реализовать базовую работу с очередью.

Читать далее

Ближайшие события

Логирование действий пользователя в Joomla. Создание плагина Actionlog

Время на прочтение16 мин
Охват и читатели520

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

Всё, что связано с действиями в админке - может логироваться: от обновления системы и компонентов, изменения настроек до редактирования и сохранения конкретных элементов (статьи, товары, категории и т.д.) и загрузки файлов в медиа менеджере. Лично мне нередко этот функционал помогал найти тех контент-менеджеров, кто дублирует названия товаров, создавая дубли и тем самым негативно влияя на SEO. Или же вдруг обнаруживается недозаполненная, но опубликованная карточка товара, которой не должно было быть, но она появилась. И ладно если б это был единичный случай...

Читать далее

CRUD на PHP с использованием файберов и пула соединений с PostgreSQL

Уровень сложностиСредний
Время на прочтение12 мин
Охват и читатели2.1K

В этой статье я подготовил для вас прототип CRUD-приложения, которое использует файберы и неблокирующие(асинхронные) возможности драйвера PostreSQL. Вместе они дают любопытные результаты по производительности и потреблению памяти.

Читать далее

Mock-объект в рабочем коде, или как тестовый двойник помог решить проблему излишне связанного кода

Уровень сложностиСредний
Время на прочтение7 мин
Охват и читатели444

На работе была поставлена задача: в главное веб-приложение нашей фирмы добавить метод формирования бланка в формате PDF «как вот в том микросервисе».

Форма бланка регулярно изменяется, и копировать её в веб-приложение означало нарушить принцип DRY («Не повторяйся») и обречь себя на постоянную двойную работу. Поэтому я решил оставить генерацию бланка в «том микросервисе».

«Тот микросервис» написан на PHP с использованием фреймворка Laravel, содержит большое число доменных объектов, экземпляры которых хранятся в БД MySQL, и имеет развитую систему API для обращения к своему функционалу.

И можно было добавить в него ещё одну точку доступа API, которая бы получала данные и на их основе формировала и возвращала бланк.

Проблема возникла из-за «неприлично» высокой связанности объектов в «том микросервисе». Так, в шаблоне, на основе которого строился бланк, использовались не просто примитивные типы данных, а объект-форма. И шаблон обращался к методам-геттерам этого объекта. А объект, в свою очередь, использовал другой доменный объект в своём конструкторе для заполнения полей.

Читать далее

Туториал: использование Go из PHP через FFI

Уровень сложностиСложный
Время на прочтение13 мин
Охват и читатели2.9K

Свою первую работу программистом на языке 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

Уровень сложностиСредний
Время на прочтение18 мин
Охват и читатели3.7K

Привет, Хабр!

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

Читать далее

Шаблон на Laravel + FrankenPHP

Уровень сложностиСредний
Время на прочтение9 мин
Охват и читатели4.8K

Всех привествую, меня зовут Денис, я PHP Backend разрботчик

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

Данная статья будет посвещена о том как я писал данный шаблон, с какими проблемами столкнулся и чему смог научиться

Читать далее

Быстрый старт работы со Смарт-процессами в коробке Битрикс24 для разработчика. Часть 3. Обработчики события

Уровень сложностиСредний
Время на прочтение6 мин
Охват и читатели1.1K

Привет, Хабр! Мы продолжаем цикл статей по работе с пока еще малознакомым многим битрикс-разработчикам инструментом оперирования данными с CRM Битрикс24 через абстрактные фабрики, как с помощью обработчиков событий можно встроить личную логику в работу с элементами CRM. В первой статье мы рассмотрели базовые операции с элементами сущностей Смарт-процессов — создание, изменение, удаление. Во второй статье рассмотрели получение данных об элементе смарт-процесса, его связях с другими элементами.

Читать далее