Поиск по триграммам

Этим материалом я открываю серию статей по методам полнотекстовых поисков. Будем разбирать:

  1. Elasticsearch — один из самых востребованных, судя по вакансиям, инструмент. Многое умеет, быстро ищет, поставляется со своим личным стеком утилит. Будем разбираться в следующей статье.
  2. Sphinx. Да-да, он вроде как уже мёртв, а вроде много где используется, хорошо работает, имеет адаптеры под разные языки и фреймворки. Так что — имеет право быть.
  3. Поиск по триграммам — интересный поиск, наименее затратный в плане реализации, и весьма эффективный. Работает благодаря расширению, подключаемому в Postgres. Именно он и будет темой сегодняшней статьи.

Про этот вид поиска я услышал на одной из предыдущих работ — мы его реализовали в условиях типичного «задача должна была быть сделана вчера», при этом поиск отлично справлялся со своими задачами, так что в последствии, от поставленной изначально задачи заменить его эластикой мы благополучно отказались.

Читать далее →

Паттерн Transactional outbox

Что может быть сложного в логировании? Создал инстанс какого-нибудь Monolog’а, навтыкал $logger->info() под каждой строчкой, выполнение которой хотелось бы запечатлить в истории, и сиди себе посматривай в журнал. А вдруг где-то будет ошибка, лог не сохранится, а логируем мы данные банковских операций?

Я не нашёл информации об этом паттерне на русском (хотя, насколько я слышал, в некоторых книгах его описывают), поэтому думаю, что эта статья имеет право на жизнь.

Читать далее →

Lumen + Docker + Websockets

Image for post

Последнее время работаю с Lumen. Lumen — это урезанная версия Laravel, аля symfony-skeleton для Symfony. По этой причине большинство решений, описанных для Laravel-систем, к Lumen’у прикрутить бывает сложно, а что-то и совсем невозможно, без переопределения vendor-пакетов.

Сегодня расскажу, как и с помощью чьей матери мне удалось завести web-сокеты в Lumen и успешно интегрировать их с Vue-клиентом.

Читать далее →

PHP + Go = ♥ или RoadRunner в действии

Привет.

Много раз уже слышал о RoadRunner — сервер веб-приложений, написанный на Go. Думаю, настало время пощупать, что это такое.

Проблема

PHP работает по простому принципу — один запрос — один процесс. Мы открываем страницу — на сервер уходит запрос. Где-то на сервере есть стек с горячими PHP-FPM процессами, один из которых выделяется и обрабатывает пришедший запрос. Отдав ответ — процесс выгружает все данные из памяти, очищает своё состояние и умирает. Это, я думаю, одна из вещей, почему многие не любят PHP. И правда, при растущих нагрузках рост процессов — неприятный удар по производительности, часто требующий пересмотра архитектуры, масштабирования и редкий поглядываний в сторону потоков, когда разработчик внезапно узнаёт, что они есть в PHP.

Читать далее →

Пишем CRUD на Symfony 4

Первым делом, расскажу о том, что такое CRUD и зачем нам это вообще нужно.

CRUD — это аббревиатура по первым буквам этого слова. Каждая из которых имеет своё обозначение:

  • С — create
  • R — read
  • U — update
  • D — delete

По сути, это просто набор базовых операций над некоторой таблицей в базе данных.

В symfony, мы пользуемся ORM(Object-Relational Mapping), которая скрывает от нас работу с таблицей напрямую, и позволяет работать с нашей базой по правилам ООП. Поэтому, в symfony приложениях мы, как правило, не работаем напрямую с нашей базой, а работаем с объектами.

Теперь о сущностях. Сущность — это модель, по которой строится наша табличка в базе. Из себя она, как правило, представляет обычный ооп класс, с той лишь разницей, что над каждым из полей имеются аннотации, которые описывают это поле в базе. Вот собственно, и вся теория на сегодня. Теперь к практике.

Для начала нам нужно развернуть наше приложение, и обернуть его в докер.

Для этого:

mkdir crud
cd crud/
composer create-project symfony/skeleton crud

Заходим в наше приложение, и создаём папку, называем её docker, в неё кладём содержимое этого репозитория: https://github.com/ko4a/dockerFiles

После этого вытащите файл docker-compose.yml из папки docker, и положите её в общую директорию проекта.

Читать далее →

Создание autoselect-компонента на Symfony/Vue. Часть 2.

Сегодня зафиналим наш autoselect-компонент. Но для начала расскажу, где я был: дорабатывал положенные 2 недели на старой работе и готовился к выходу на новую. Больше пока сказать не могу, кроме того, что компания большая, требуют там больше и работать надо будет упорно, чтобы пройти испытательный. Зато буду больше писать о всяком. А теперь к нашим баранам. В первой части мы немного затронули Vue, написали первый компонент и закончили на этом. Сегодня так просто отделаться не получится — будет и бэк, и фронт, и интересные либы и много нового материала.

Для начала нужно мОкнуть данные с бэка. Что такое мокнуть? Это значит подделать (получить фэйковые данные для тестов). С этими данными будет работать наш компонент, написанный в 1-ой части.

Чтобы это сделать, нам нужно некоторое количество записей в какой-либо таблице. Я создам таблицу Product, каждая запись в которой будет состоять из 4-х частей: id, название продукта, дата поступления и количество.

Чтобы всё сделать по науке мы познакомимся такой вещью, как фикстуры — классы, которые автоматизируют создание записей и используется для тестов. Я познакомился с этим понятием относительно недавно в одном из манов от symfonycast. Но обо всём по порядку. Сначала установим свежую копию Symfony. Устанавливать буду пакет symfony/skeleton — без дополнительных библиотек. Как это сделать я описывал в одном из первых уроков на канале, там всё максимально подробно и с картинками 🙂 Привожу только листинг:

 
Читать далее →