Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

Tutorial

  • записи
    3
  • коментаря
    42
  • перегляду
    3 552

Запуск и отладка Opencart с помощью Docker и xDebug


ozzzi

5 834 перегляди

Если вы до сих пор в качестве тестовой среды используете OpenServer или Хостинг+FTP, а единственным инструментом для дебага является var_dump, то самое время попробовать Docker и xDebug.

 

Docker - ПО для запуска сервисов в изолированных контейнерах. Т.е. для запуска приложения мы можем создать необходимое количество контейнеров: веб-сервер, интерпретатор PHP, запустить базу данных. Нам не нужно захламлять систему всеми этими сервисами, все будет установлено внутри докера. При этом мы можем использовать для разных проектов разный набор версий php, mysql и т.д.

 

В отличии от полноценных виртуальных машин (VirtualBox + Vagrant) нам не нужно скачивать образ операционной системы и ставить каждый раз полноценные версии сервисов. В докере используются облегченные версии ПО и если в одном проекте вы уже использовали PHP 7.3, то для другого проекта не нужно будет ничего качать и заново пересоздавать.

Вместе с Docker мы будем использовать дополнительный инструмент од названием Docker Compose. Он помогаем с помощью одного конфигурационного файла управлять группой контейнеров. 

 

Вместе с Docker мы будем использовать дополнительный инструмент од названием Docker Compose. Он помогаем с помощью одного конфигурационного файла управлять группой контейнеров. 

 

Что мы установим для нашего проекта:

  • PHP-FPM 7.3
  • Nginx
  • MySQL 5.7
  • Adminer

 

С докером определились, он поможет за 5 минут создать тестовое окружение с нужным набор сервисов.

 

XDebug - дополнение к PHP, которое помогает производить отладку и профилирование кода. В статье будет описана работа совместно с IDE: PhpStorm и VS Code. 

 

Приступим к практике.

 

Установка Docker

Docker: https://docs.docker.com/get-docker/
Docker Compose: https://docs.docker.com/compose/install/

 

Надеюсь, git у вас уже установлен (если нет, читайте блог https://opencartforum.com/blogs/entry/326-git-i-opencart-dlya-samyh-malenkih). 

Переходим в директорию проекта и клонируем репозиторий:

 

git clone [email protected]:ozzzi/docker-opencart.git .

В данном репозитории содержится конфигурация для запуска Opencart.

 

Структура директорий:

db - файлы базы данных
hosts - конфигурационный файл nginx. Конфигурационный файл настроен на использование домена oc.dev
images - файлы для создания образов
    Dockerfile - файл конфигурации образа
    php.ini - конфиг PHP
    mods - директория для загрузки конфигов дополнений 
logs - логи различных сервисов. По умолчанию настроен только лог для Nginx
.env - переменные окружения (в нем хранятся конфиги для MySQL).

 

docker-compose.yml - конфигурационный файл Docker Compose

 

Разберем файл docker-compose.yml

services - список сервисов (контейнеров). Для каждого сервиса (nginx, mysql и т.д.) принято создавать отдельный контейнер.

 

Список основных директив:
image - образ для создания контейнера. Образы хранятся тут: https://hub.docker.com
build - путь к Dockerfile для создания кастомного образа. Например, для PHP нам нужно установить ряд дополнений, поэтому нам нужно создать собственный образ. MySQL, Nginx мы вполне можем использовать без изменений. 
container_name - имя контейнера
ports - пробрасываем порты из контейнера на порты локального компьютера (порт компьютера:порт контейнера).
volumes - связываем папки на локальном компьютере и директории в контейнере. Используем для пробрасывания конфигов и файлов в контейнер, а также для сохранения данных сервисов в контейнере после перезагрузки (базы данных и т.д.).

 

Перейдем к настройке PHP в Dockerfile-е.

FROM - импортируем базовый образ из docker hub.
RUN - запускаем консольные команды Linux внутри контейнера для установки нужных пакетов: curl, zip и т.д.
ADD - импортируем файлы конфигов php и конфиг xDebug в контейнер
WORKDIR - рабочая директория

 

Команды для управления нашими контейнерами:
docker-compose up - запуск контейнеров
docker-compose up -d - тоже самое, но можно не держать открытым окно терминала
docker-compose up -d --build - собираем проект и запускаем, после внесения изменений также нужно запускать с данным ключем.
docker-compose stop - останавливаем контейнеры
docker-compose down - останавливаем  и удаляем контейнеры
docker-compose ps - выводит список запущенных контейнеров

 

Установка опенкарт

Файлы движка нужно закинуть в директорию www/oc.dev.

 

Чтобы домен был доступен по адресу oc.dev, нужно править файл hosts:
Ubuntu:

sudo gedit(ваш текстовый редактор) /etc/hosts

Windows:

windows\system32\drivers\etc\hosts

Вносим запись:

127.0.0.1 oc.dev

Данные для доступа к базе данных хранятся в файле .env (название базы, пользователь и пароль), а в качестве имени хоста мы используем имя контейнера базы данных: db.

Устанавливаем Opencart как обычно.

 

сли у вас есть проблемы с доступом к файлам и папкам (логи, кеш), вам помогут эти команды:
sudo chown -R $USER:$USER directory - устанавливает текущего пользователя владельцем директории (в контейнере скрипты исполняются от пользователя www-data)
sudo chmod -R 777 directiroy - права 777 для директории

 

Настройка xDebug

 

Файлы конфигурации хранятся по адресу:

/images/php/mods/xdebug.ini

 

Здесь нас интересует одна опция xdebug.remote_host. В ней нужно указать ip-адрес контейнера. Для Windows и Mac можно указать равным host.docker.internal

 

Для Linux на запущенном контейнере набираем в консоли:

docker inspect php-fpm | grep IPAddress

Полученный IP прописываем в конфиг xdebug.ini, в моем случае:

xdebug.remote_host = 172.25.0.2 (или 172.25.0.1, если не заведется отладчик)

Остановим и перезапустим наши контейнеры с опцией --build.

 

Настройка PHPStorm для работы с xDebug

 

1. Заходим в меню Run/Edit Configuration. Добавляем тип конфига "PHP Remote Debug"

 

1-step.thumb.jpg.f5748f36a54997592d39ffadcc970540.jpg

 

2. Нужно добавить Server

2-step.thumb.jpg.e86f8c569c6fffd714dbdc3ef0a6a285.jpg

 

3-step.jpg.dbbb23f975f9e10992d7f17100e7c2d7.jpg

 

Name - имя сервера вводим любое. Нужно поставить галочку Use path mappings, значения должны быть такими:
слева (File/Directory) - путь до папки на локальном компьютере, куда копировали Opencart.
справа (Absolute path on the server) - путь внутри контейнера: /var/www/oc.dev

 

3. Заполняем название конфигурации (любое). Вносим метку, на которую будет реагировать IDE: PHPSTORM.

4-step.thumb.jpg.634d34f7201a807d54ae4c036143f016.jpg

 

 

4. Проверим работу xDebug нажатием на ссылку Validate.

5-step.thumb.jpg.9718e340b3dd2b1d65be75490bce0a30.jpg

 

Приступаем к отладке

 

Для примера мы хотим узнать, какие модули отображаются на главной странице в позиции Top. Открываем файл catalog/controller/common/content_top.php. Нас заинтересовала строка 49, в которой можно посмотреть код модуля. Возле номера строки ставим точку остановки (Breakpoint) левой кнопкой мыши. 

 

6-step.thumb.jpg.8087c898f2e39d54438c1fab83d7470d.jpg

 

Чтобы вызвать работу отладчика выбираем конфигурацию, которую мы добавилил в 3-м пункте, жмем на Debug 'Docker' (зеленый жук) в панели справа,сверху и включаем прослушку Start Listaning for PHP Debug Connections (трубка). Обновляем главную страницу сайта. Должен сработать отладчик и вы увидите:

 

7-step.thumb.jpg.43457db304b30eac58fc52db100a8437.jpg

 

 

Окно отладки:
1. Данной кнопкой можно поменять брекпойнты и вернуться назад к отладке.
2. Кнопка просмотра точек остановки.
3. Синие стрелки вверх/вниз позволяют пробегать построчно по коду (вверх/вниз)
4. Все доступные переменные на момент остановки скрипта.
5. Стек вызова - можем проследить полный путь вызова.
 

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

 

8-step.jpg.bc4b9d71f6e7210d137b8dcdb47ac3d8.jpg

 

 

Настройка VS Code для работы с xDebug

 

1. У вас должно быть установлено дополнение PHP Debug

9-step.thumb.jpg.d78a02008fcb8b5eb4d2b1515f7ede10.jpg

 

2. Breakpoints ставятся возле нумерации строк.

10-step.thumb.jpg.7c2f2212c5f8da4a5da5f18d666d9beb.jpg

 

3. Включаем окно отладки (Ctrl + Shift + D) и нажимаем на ссылку create a launch.json file.

11-step.jpg.944f69d02470dc08b6066dffcaf5bff7.jpg

 

Код launch.json

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Listen for XDebug",
            "type": "php",
            "request": "launch",
            "port": 9000,
            "log": true,
            "externalConsole": false,
            "pathMappings" : {
                "/var/www/oc.dev/": "${workspaceFolder}"
            }
        }
    ]
}

 

4. Отладка:

12-step.thumb.jpg.26a82e12b2861266d0a953d6f1a81cdc.jpg

 

  1. Запуск отладчика
  2. Панель управления. Здесь также можно остановить и обновить отладку, а также пробежаться по строчкам кода.
  3. Здесь отображаются все переменные.
  4. Стек вызова.

 

Надеюсь, что эти советы помогут вам вести более продуктивную разработку и отладку кода.

 

  • +1 12

24 коментаря


Recommended Comments

И зачем эта ересь, когда 2.5 евро стоит Клауд и 4 евро панель, либо фри бесплатные аналоги, которые разворачивают любое окружении в два счёта а xdebug. На любителя непонятно тоже зачем.

 

Тут как бы на вкус и цвет фломастеры разные. Но реально зачем?

  • +1 1
Надіслати
8 минут назад, Yoda сказал:

Тут как бы на вкус и цвет фломастеры разные. Но реально зачем?

 

Лично мне так удобней и быстрей развернуть тестовое окружение под каждый проект, чем настраивать на хостинге под каждый сайт свою версию PHP и кучу других пакетов, которые не будут нужны в другом проекте.

 

Ну к тому же нельзя забывать про требования рынка, нужно следить за трендами.

  • +1 2
Надіслати
2 часа назад, ozzzi сказал:

 

Лично мне так удобней и быстрей развернуть тестовое окружение под каждый проект, чем настраивать на хостинге под каждый сайт свою версию PHP и кучу других пакетов, которые не будут нужны в другом проекте.

 

Ну к тому же нельзя забывать про требования рынка, нужно следить за трендами.

советую перейти с docker-compose на minikube или хотябы попробовать

Надіслати
5 часов назад, ozzzi сказал:

 

Лично мне так удобней и быстрей развернуть тестовое окружение под каждый проект, чем настраивать на хостинге под каждый сайт свою версию PHP и кучу других пакетов, которые не будут нужны в другом проекте.

 

Ну к тому же нельзя забывать про требования рынка, нужно следить за трендами.

Можно поподробнее.
Вот какие такие пакеты - там нужны, тут нет?

И что за требования рынка, которым нужен докер ?

Надіслати
12 минут назад, Yoda сказал:

Можно поподробнее.
Вот какие такие пакеты - там нужны, тут нет?

 

На всех проектах разные версии PHP, там нужен ioncube, а там он не нужен, для одного проекта достаточно последнего PHP и RabbitMQ, для других они не нужны, для проектов на опенкарт используется MySQL, для других PostgreSQL, для третьего Elastic. Мне легче управлять этим зоопарком из докера.

 

20 минут назад, Yoda сказал:

И что за требования рынка, которым нужен докер ?

Документация любого современного фреймворка, вакансии о работе. 

Надіслати
3 часа назад, EVMedvedev сказал:

 

А что это дает?

более удобную оркестрацию контейнеров и нет зависимоти от питона

Надіслати
37 минут назад, stickpro сказал:

более удобную оркестрацию контейнеров и нет зависимоти от питона

Эти дежурные фразы есть в любой статье по minikube  :-). Может вы можете рассказать чуть больше? В чем это большее удобство заключается. А зависимость от чего либо есть практически всегда. Не питон, так руби. Не руби, так NodeJS и т.д.

Надіслати
12 hours ago, EVMedvedev said:

Эти дежурные фразы есть в любой статье по minikube  :-). Может вы можете рассказать чуть больше? В чем это большее удобство заключается. А зависимость от чего либо есть практически всегда. Не питон, так руби. Не руби, так NodeJS и т.д.

 

тут вопрос в другом, на кой черт вообще кубер нужен для опенкарта. 

  • +1 1
Надіслати
30 минут назад, magecode сказал:

тут вопрос в другом, на кой черт вообще кубер нужен для опенкарта. 

так можно говорить про все что угодно, зачем опенкарту  php7, бутсрап 4,  nginx, когда есть апач, mysql8

Надіслати
8 часов назад, magecode сказал:

 

тут вопрос в другом, на кой черт вообще кубер нужен для опенкарта. 

 

На самом деле вопрос поставлен не совсем корректно. Docker ну и др. виртуальные машины, нужны не для какого то движка, а для удобства разработчиков при работе в определенных условиях. Например если работает группа разработчиков над сложным и активно посещаемым сайтом, то организация работы будет другой. Команда должна развернуть репозитарий на гите, с репозитария раздать всем кодерам копию кода и настройщик среды, в которой крутиться сайт на продакшене (докер файл). Кодеры восстанавливают среду у себя на виртуальных машинах, кодят и комитят изменения на гит. После решения задачи делается копия продакшн сервера на отладочный и проводится операция апдейта копии рабочего сайта с гита (деплой). Если все проходит нормально, то продакшн сервер останавливается на короткое время и с гита деплоятся изменения, в расчете на то, что на продакшн сервере все сработает так, как это было на отладочном.

Другое дело, что такие проекты на Опенкарт не делаются (он для этого просто не предназначен) и в этом случае вы правы - такие сложные вещи для ОС не нужны.

Надіслати

Дискуссия медленно перетекает в зачет по микросервисам.
Один товарищ пришел предложил впихнуть кубер, другой решил описать свой ci.
ТС написал небольшую доку по запуску докера для опенкарт, берите и пользуйтесь.

@ozzzi насчет пользуйтесь, было бы неплохо приложить в статью готовые yml кейсы.

Надіслати
19 минут назад, magecode сказал:

Дискуссия медленно перетекает в зачет по микросервисам.
Один товарищ пришел предложил впихнуть кубер, другой решил описать свой ci.
ТС написал небольшую доку по запуску докера для опенкарт, берите и пользуйтесь.

@ozzzi насчет пользуйтесь, было бы неплохо приложить в статью готовые yml кейсы.

 

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


А что касается того что опенкарту это не надо, ну это не надо в ваших реалиях, там где вы не сталкиваетесь, мне приходится видеть монстров из кучи сервисов, слепленных черех OC в качестве вебморды и ниче - все отлично работает.

 

Надіслати
5 минут назад, magecode сказал:

 

Это даже звучит безнадежно

 

Не знаю, безнадежно звучит ваш комментарий, а владелец проекта porsche 911 на бентайгу собрался менять.
 

А у еще одного, у которого база в докере уже 2 года живет на 40 гигабайт SLA 100%.

Надіслати
8 minutes ago, Yoda said:

 

Не знаю, безнадежно звучит ваш комментарий, а владелец проекта porsche 911 на бентайгу собрался менять.
 

А у еще одного, у которого база в докере уже 2 года живет на 40 гигабайт SLA 100%.

 

Скажите пускай берет моделХ и не выдумывает

Надіслати
6 минут назад, magecode сказал:

 

Скажите пускай берет моделХ и не выдумывает

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

Надіслати
7 minutes ago, Yoda said:

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

 

ничего не получится, у меня плохая кредитная история, примерно такая же как с вашим монстр сервисом

Надіслати
В 12.01.2021 в 11:59, stickpro сказал:

так можно говорить про все что угодно, зачем опенкарту  php7, бутсрап 4,  nginx, когда есть апач, mysql8

 

Кстати - есть неплохое обоснование тому, для чего нужно использовать docker-compose. Разработчикам модулей например важно обкатать свое детище на всех версиях PHP, возможно на разных комбинациях настроек связки PHP и WEB-сервера, протестировать на разных вариантах кэширования и т.п. Можно быстро компоновать разные варианты хостинга. А дальше переход к автоматизации тестирования с помощью travis ci. Но это уже для профессиональных разработчиков модулей скорее. Тех кто хочет делать качественные продукты.

Надіслати
4 часа назад, EVMedvedev сказал:

Тех кто хочет делать качественные продукты.

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

  • +1 1
Надіслати
17 часов назад, buslikdrev сказал:

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

 

Чтобы делать качественные продукты, надо уметь это делать. А для этого нужно владеть соответствующими инструментами.

  • +1 1
Надіслати

Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку

×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.