Арамаис Манасян djenjoy96
Сайты, Telegram-боты и AI-решения под ключ
Рейтинг
5 602
№ 252 в каталоге
Отзывы
Профессионализм
10/10
Коммуникация
10 /10
Город
Москва
Опыт работы
6 лет
На сайте с
2026 года
Юридический статус
Частное лицо

Починка и ускорение интернет-магазина швейного оборудования на OpenCart 2.3 (ocStore): поиск, оформление заказа 13 с => 1 с, кэш опкодов, мобильная вёрстка, формы кредита

Используемые навыки JavaScript MySQL Open Cart PHP Веб-программирование

Описание

Заказчик - владелец интернет-магазина швейного оборудования на ocStore 2.3 (форк OpenCart 2.3): около 2900 товаров, тема Revolution с дочерней темой, PHP 7.1 в режиме CGI, MySQL 5.7, хостинг с доступом по SSH и FTP, сторонние модули кредита, рассрочки и оплаты.

Накопился список проблем, которые мешали продавать. Поиск по сайту не реагировал на Enter и на лупу в части блоков. Страница оформления заказа открывалась 13 секунд. На телефоне лупа поиска торчала за правый край, и страница ехала вбок. Кнопки товара вылезали за рамку карточки. Формы «Купить в кредит» и «Купить в рассрочку» открывались, но заявка не уходила, и клиенты терялись. Хостинг советовал включить кэш опкодов, но эффекта от этого не было.

Особенность площадки: движок рендерит не файлы темы, а их скомпилированные копии, которые собирает система модификаций OCMOD. Правка файла темы без пересборки ничего не даёт. Нужно было найти настоящую причину каждой проблемы, починить так, чтобы не сломать соседнее, проверить замерами и сделать так, чтобы правки не откатывались при следующем сохранении настроек темы.

Решение

Поиск. Обработчик отправки формы был привязан к классам обёрток блока поиска, а обёрток на сайте несколько: шапка, мобильное меню, боковая колонка, страница результатов. Где класс не совпадал, обработчик просто не навешивался. Переписал на делегированный обработчик, привязанный к самому блоку поиска: работает для всех блоков, сколько бы их ни было. Учёл мобильные клавиатуры: кроме keyCode проверяется e.key, потому что на части клавиатур и при вводе через IME keyCode приходит нулевым. Фильтр по категории сохранил.

Оформление заказа. Метод получения адресов выбирал их по customer_id. У гостя он равен нулю, и запрос возвращал все «ничьи» адреса, накопившиеся от гостевых заказов за годы, а на каждый адрес движок делал ещё два запроса: страну и регион. Добавил проверку: у неавторизованного покупателя адресной книги нет, возвращаем пустой массив сразу. 13 секунд превратились в 1.

Кэш опкодов. Совет «включить opcache» не работал по двум причинам, обе проверил. В CGI-сборке PHP 7.1 расширение не загружено вовсе, нужен zend_extension. Процессы PHP живут ровно один запрос, и кэш в памяти не доживает до следующего обращения: написал пробник, который смотрит счётчики hits и misses между запросами, hits каждый раз ноль. Замерил три режима на пяти страницах: без кэша 3,82 с, кэш в памяти 4,29 с (стало хуже, откатил), кэш на диске 3,49 с. Оставил кэш на диске, каталог закрыл от веба через .htaccess, в планировщик добавил чистку кэша при росте больше 150 МБ.

Мобильная вёрстка. Клиент связывал поломку с заменой карты в контактах. Сравнил md5 скомпилированных файлов на трёх датах и доказал, что карта ни при чём: правило для лупы лежало в поле «Свой CSS» настроек темы и задавало 50 px со сдвигом вправо без ограничения по ширине экрана, на 375 px иконка вылезала на 27 px. Финальный вид согласовывали по скриншотам за восемь итераций, промежуточные версии вёл в журнале правок. Геометрию проверял на четырёх ширинах (1280, 1024, 648, 375) с точностью до пикселя, плюс контроль отсутствия горизонтальной прокрутки. Три правила из «Своего CSS» удалил прямым обновлением значения в базе, сначала на тестовом сайте, с бэкапом всех 65 строк настроек темы: иначе каждое «Сохранить» возвращало бы их обратно.

Сверка стилей боевого и тестового сайтов. Написал парсер, который сравнивает CSS не построчно, а по смыслу: приводит оба файла к структуре «медиа-условие, селектор => свойства» и сравнивает значения. Файлы отличались на 53 КБ, реальных расхождений оказалось семь. Три уже были закрыты, одно исправил сразу (отступы карточек съедались, ценник вылезал за экран и в категориях появлялась горизонтальная прокрутка), три описал клиенту как похожие на осознанную настройку, а не на поломку.

Кнопки товара. Скрипт темы проставлял блоку кнопок в каруселях жёсткую высоту 74 px. После того как кнопки поставили в столбик, блоку нужно 95 px, а скрипт высоту не пересчитывает. Снял жёсткую высоту: до правки на главной вылезали 10 карточек из 19, после ноль, высота подстраивается сама.

Кредит и рассрочка. Тема прячет все чекбоксы внутри карточки товара, потому что там это переключатели опций, оформленные через соседний label. У галочек согласия на обработку персональных данных своего label нет, они исчезали, а браузер отказывался отправлять форму с невидимым обязательным полем и подсказку показать не мог. Добавил точечное правило, возвращающее видимость именно этим галочкам, переключатели опций не тронуты.

Порядок работы: каждая правка сначала на тестовой копии; перед изменением боевого сайта бэкап и записанная команда отката; по каждой задаче журнал с файлами «до» и «после», причиной, проверкой и способом отката. Стек: PHP 7.1, MySQL 5.7, JavaScript и jQuery, CSS, шаблоны .tpl, OpenCart 2.3 и OCMOD, SSH и FTP.

Результат

Поиск работает во всех блоках и с мобильных клавиатур. Оформление заказа открывается за 1 секунду вместо 13. Кэш опкодов на диске дал 3,49 с против 3,82 с на пяти страницах, неудачный вариант откатил по замерам, а не по ощущениям. Мобильная вёрстка совпадает с эталоном на четырёх ширинах, горизонтальной прокрутки нет. Кнопки товара не вылезают из карточек: ноль из 19 вместо 10 из 19. Заявки на кредит и рассрочку снова уходят.

Источник поломок в поле «Свой CSS» удалён из базы, настройки темы больше его не возвращают. Из семи расхождений стилей между боевым и тестовым сайтом три переданы заказчику на решение как похожие на осознанную настройку.

По каждой задаче остался журнал: что было, почему, что сделано, чем проверено, как откатить. Работа выполнена с 28 августа по 10 сентября 2026 вместе со второй работой для того же заказчика: перенос каталога во второй магазин на OpenCart 3. Магазин публичный, ссылка в примерах.

Оценили проект:

Другие проекты

Все проекты →
Веб-разработка и IT Корпоративный сайт сети итальянских ресторанов Perchini
Корпоративный сайт сети итальянских ресторанов Perchini
80
Веб-разработка и IT Автопрохождение подземелий в «Мире Теней»: юзерскрипт
Автопрохождение подземелий в «Мире Теней»: юзерскрипт
11
Веб-разработка и IT Перенос 1840 товаров в интернет-магазин на OpenCart 3: поиск дублей, удаление водяного знака с 6275 фото, 1840 описаний заново, формы согласия, кнопка «Уточнить наличие»
Перенос 1840 товаров в интернет-магазин на OpenCart 3: поиск дублей, удаление водяного знака с 6275 фото, 1840 описаний заново, формы согласия, кнопка «Уточнить наличие»
16
Веб-разработка и IT Разработка интернет-магазина строительных и отделочных материалов для сети строймаркетов Сатурн
Разработка интернет-магазина строительных и отделочных материалов для сети строймаркетов Сатурн
61