PHP-разработчик (Backend, Middle+/Senior)

PHP-разработчик (Backend, Middle+/Senior)

Санкт-Петербург, Лиговский проспект, 232

Метро: Обводный Канал

Описание вакансии

Обязанности:
  • Разработка и развитие модулей: каталог, карточки товаров, ценовые предложения, атрибуты и фильтры,
    кабинеты продавцов, биллинг
  • Развитие конвейера обработки товарных данных: парсеры прайсов и фидов, алгоритмы идентификации и
    сопоставления товаров
  • Оптимизация работы с базой: профилирование и переработка тяжёлых SQL-запросов, проектирование
    индексов и структур таблиц
  • Развитие REST API для админки и кабинета продавца
  • Развитие серверного рендеринга публичной витрины
  • Работа с фоновыми задачами: CLI-команды, Job-классы, очереди на Redis, воркеры
  • Интеграции с внешними системами: ЭДО (Диадок), Яндекс.Маркет, IndexNow, платёжные и почтовые сервисы
  • Написание миграций (Phinx) и тестов (PHPUnit)
  • Настройка и поддержка логирования, мониторинга и алертинга (Sentry)
  • Постепенное улучшение архитектуры и снижение техдолга — у нас нет иллюзий по поводу состояния некоторых частей системы
  • Участие в код-ревью, планировании задач и выработке архитектурных решений
  • Совместная работа с frontend-разработчиками и QA
Требования:
  • Опыт коммерческой разработки на PHP от 3 лет, уверенное знание PHP 8.x
  • Уверенная работа с MySQL: написание и оптимизация сложных запросов, чтение планов выполнения (EXPLAIN), индексы, блокировки, транзакции
  • Опыт работы с нативным SQL и PDO без ORM: подготовленные выражения, защита от инъекций, осознанная работа с транзакциями
  • Опыт работы с миграциями БД (Phinx, Doctrine Migrations или аналоги)
  • Опыт проектирования и разработки REST API
  • Опыт работы с Redis (кэш, сессии, очереди)
  • Опыт написания CLI-команд и фоновых воркеров, понимание особенностей долгоживущих PHP-процессов: потребление памяти, идемпотентность, поведение при падениях
  • Опыт обработки больших объёмов данных: пакетная обработка, потоковое чтение файлов, контроль памяти
  • Опыт реализации интеграций по HTTP (Guzzle или аналоги), работа с нестабильными внешними API: таймауты, ретраи, обработка ошибок
  • Опыт написания unit- и функциональных тестов (PHPUnit)
    Знание Composer, Git
  • Умение читать и анализировать логи backend-сервисов
  • Способность разбираться в чужом коде и дорабатывать существующую систему без полного переписывания
  • Умение самостоятельно разбираться в сложных задачах, принимать решения и аргументировать выбранный подход
  • Ответственное отношение к архитектуре, качеству кода и долгосрочной поддержке продукта

Плюсом будет

  • Опыт работы с агрегаторами, маркетплейсами, крупными каталогами или e-commerce
  • Опыт написания парсеров прайс-листов и товарных фидов (YML, XML, XLSX, CSV), задач сопоставления и дедупликации товаров
  • Опыт реализации фасетного поиска и фильтрации по большому числу параметров
  • Опыт постепенного рефакторинга легаси: выделение слоя доступа к данным, снижение связанности, покрытие тестами
  • Знание Doctrine DBAL/ORM — рассматриваем поэтапное внедрение
  • Опыт работы со статическим анализом (Psalm, PHPStan)
  • Опыт работы с очередями (RabbitMQ, Kafka) — на случай развития текущей очереди на Redis
  • Опыт настройки CI/CD (GitHub Actions), Docker
  • Опыт работы с системами мониторинга (Grafana, Prometheus, Sentry)
  • Понимание SEO для крупных каталогов и серверного рендеринга
  • Опыт работы с мультитенантными платформами


О проекте :

Costo.ru — агрегатор интернет-магазинов и маркетплейсов России: каталог товаров, сравнение цен от десятков магазинов, характеристики, рейтинги и отзывы.

Под капотом — собственная платформа на PHP 8.3, на которой работает не один проект: помимо Costo на том же движке живёт второй бренд со своей базой, своим сервером и своей темой оформления. Каждое изменение в ядре затрагивает оба бизнеса — это накладывает отпечаток на то, как мы работаем.


Проект состоит из трёх приложений:
costo.ru — публичная витрина, рендерится на сервере (PHP + собственный шаблонизатор)
admin.costo.ru — административная панель (Vue 3 SPA)
seller.costo.ru — кабинет продавца (Vue 3 SPA)
Backend обслуживает все три и отвечает как за HTML-рендеринг витрины, так и за REST API для админок.

Чем интересна задача

Конвейер товарных данных. Магазины присылают прайс-листы и фиды в разных форматах (XLSX, CSV, XML/YML). Их надо распарсить, идентифицировать товары, сопоставить с карточками каталога, собрать ценовые предложения, отсеять мусор и ошибки, обновить цены и наличие. Всё это — регулярно, по расписанию, на больших объёмах. Задача сопоставления товаров нетривиальная и никогда не бывает «доделанной».


Фасетный поиск. В каталоге 3000+ атрибутов в 23 разделах, семь типов значений (булевы, числовые с единицами измерения, строки с размерами вида 500x100x200, даты), пять типов фильтров (чекбоксы, радио, range, больше/меньше, исключение) и их комбинации через И/ИЛИ. Всё это работает на нативном SQL и должно отвечать быстро.


SEO как инженерная задача. Витрина рендерится на сервере, поэтому скорость ответа backend напрямую влияет на позиции. Плюс ЧПУ-ссылки, sitemap, IndexNow, генерация SEO-полей, виртуальные категории, теги с
динамическими подборками по сохранённым фильтрам.

Честно о проекте

Мы не будем делать вид, что у нас идеальный код.

Архитектура самобытная. Это не Symfony и не Laravel, а собственный фреймворк поверх FastRoute, PHP-DI и компонентов Symfony. Роутинг автоматический, по файловой системе: URL /api/admin/seo/read соответствует файлу app/modules/admin/seo/entry/read-api.php . У модуля три типа точек входа: -web (HTML), -api (JSON) и -inner
(вызов из других модулей через роутер). Ядро приложения — Singleton + Service Locator. ORM нет, весь SQL нативный. Шаблонизатор публички — собственный, со своим синтаксисом.

Если вы работали только с классическими фреймворками, первые недели будут непривычными. Зато система прозрачная: нет магии, всё можно проследить руками.

При этом инфраструктура зрелая. Миграции и сиды на Phinx, unit- и acceptance-тесты с фабриками на все основные сущности, статический анализ (Psalm, PHPCS, PHPMD), Sentry, GitHub Actions с раздельными пайплайнами под production, staging и test, пять окружений с изолированными базами, включая песочницы для экспериментов с массовыми обновлениями данных.

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

Для нас особенно важно

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

Наш стек

Язык: PHP 8.3
Фреймворк: собственный — FastRoute, PHP-DI, компоненты Symfony (String, Mailer, Translation)
База данных: MySQL 8, PDO и mysqli (нативный SQL), миграции и сиды — Phinx
Кэш, сессии, очереди: Redis, собственная реализация очередей на Job-классах, воркеры
Интеграции: Guzzle, Диадок (ЭДО, OpenID Connect), Яндекс.Маркет, IndexNow
Работа с данными: PhpSpreadsheet, SimpleXLSX, opis/json-schema
Изображения: Imagick
Качество кода: PHPUnit, Psalm, PHP_CodeSniffer, PHPMD
Мониторинг: Sentry
Инфраструктура: Ubuntu, nginx, Selectel, GitHub Actions, раздельные контуры (production / staging / test)
Frontend (для контекста): Vue 3 + Ant Design Vue в админках, серверные шаблоны + Tailwind на витрине

Формат работы

Мы работаем в офисе по понедельникам и пятницам, ориентировочно с 10:00 до 17:30. Офис находится в собственности компании — это не арендное пространство. Мы постарались сделать его максимально комфортным и уютным: скорее он напоминает небольшой бутик, чем классический офис.

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

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

Навыки
  • PHP
  • MySQL
  • Git
Посмотреть контакты работодателя

Адрес

Похожие вакансии

Грузовичкоф

PHP-разработчик

Грузовичкоф

  • Санкт-Петербург

  • Не указана

Рекомендуем
Софтвайс

PHP developer

Софтвайс

  • Санкт-Петербург

  • до 350000 RUR

Рекомендуем
Аеза Групп
  • Санкт-Петербург

  • до 300000 RUR

Рекомендуем
585, Холдинг
  • Санкт-Петербург

  • до 300000 RUR

Аналитик/Backend разработчик

Tуристическая компания

  • Санкт-Петербург

  • до 300000 RUR

  • Санкт-Петербург

  • от 190000 RUR

Лазерные Системы
  • Санкт-Петербург

  • до 300000 RUR

Maxim technology
  • Санкт-Петербург

  • до 300000 RUR

Грузовичкоф

Разработчик C++ (Senior)

Грузовичкоф

  • Санкт-Петербург

  • до 300000 RUR

Грузовичкоф
  • Санкт-Петербург

  • до 300000 RUR

КСОР
  • Санкт-Петербург

  • до 300000 RUR

Эн-Системс
  • Санкт-Петербург

  • от 250000 RUR

КЕЙС ПЛЭЙС

Главный бухгалтер

КЕЙС ПЛЭЙС

  • Санкт-Петербург

  • от 200000 RUR

Бизнес Технологии

Senior frontend-разработчик

Бизнес Технологии

  • Санкт-Петербург

  • до 300000 RUR

Честный знак.рф
  • Санкт-Петербург

  • до 300000 RUR

  • Санкт-Петербург

  • до 300000 RUR

Karuna
  • Санкт-Петербург

  • до 300000 RUR

  • Санкт-Петербург

  • до 300000 RUR

SkillStaff
  • Санкт-Петербург

  • до 300000 RUR

Хотите оставить вакансию?

Заполните форму и найдите сотрудника всего за несколько минут.
Оставить вакансию