CodeStar Academy
  • Trang chủ
  • Khóa học
  • Lịch khai giảng
  • Blog
  • Liên hệ
  • Trang chủ
  • Khóa học
  • Lịch khai giảng
  • Blog
  • Liên hệ

XDebug vs Docker

  • Tháng Ba 12, 2021
  • Posted by: codestar
  • Category: Uncategorized
Không có phản hồi

Thấy anh/chị em dùng docker khá là vất vả trong việc setup XDebug nên share config của dự án mình đang làm cho anh/chị em tham khảo.

1. Dựng docker cho dự án

Dự án hiện tại gồm 2 phần.
・ Hệ thống cũ bằng cakephp v2.x, php5.6
・ Hệ thống mới upgrade lên cakephp 4.x vs php 7
・ DB thì cả hai hệ thống dùng chung mysql 5.6.x
・ Verion upgrade thì dùng cache bằng Redis.
Đầu tiên thì ta phải tạo dockerfile cho 2 phần hệ thống cũ vs hệ thống mới.
Các bạn tham khảo 2 file dưới đây.

Docker file cakev2.

FROM php:5.6-apache

#install all the system dependencies and enable PHP modules
RUN apt-get update && apt-get install -y \
      libicu-dev \
      libpq-dev \
      zlib1g-dev \
      libzip-dev \
      libmcrypt-dev \
      libxml2-dev \
      mysql-client \
      curl \
      git \
      zip \
      unzip \
      vim \
    && rm -r /var/lib/apt/lists/* \
    && docker-php-ext-configure pdo_mysql --with-pdo-mysql=mysqlnd \
    && docker-php-ext-install \
      intl \
      mbstring \
      mcrypt \
      xml \
      pdo_mysql \
      pdo_pgsql \
      pgsql \
      zip \
      opcache

# Install composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin --filename=composer

# Install Xdebug
RUN curl -fsSL 'https://xdebug.org/files/xdebug-2.4.0.tgz' -o xdebug.tar.gz \
    && mkdir -p xdebug \
    && tar -xf xdebug.tar.gz -C xdebug --strip-components=1 \
    && rm xdebug.tar.gz \
    && ( \
    cd xdebug \
    && phpize \
    && ./configure --enable-xdebug \
    && make -j$(nproc) \
    && make install \
    ) \
    && rm -r xdebug \
    && docker-php-ext-enable xdebug
ARG CAKEV2_XDEBUG_REMOTE_HOST
ARG CAKEV2_XDEBUG_REMOTE_PORT
ARG CAKEV2_XDEBUG_IDEKEY
RUN echo "date.timezone=Europe/Warsaw" >> /usr/local/etc/php/php.ini \
    && echo "xdebug.default_enable=1" >> /usr/local/etc/php/php.ini \
    && echo "xdebug.remote_enable=1" >> /usr/local/etc/php/php.ini \
    && echo "xdebug.remote_port=$CAKEV2_XDEBUG_REMOTE_PORT" >> /usr/local/etc/php/php.ini \
    && echo "xdebug.remote_handler=dbgp" >> /usr/local/etc/php/php.ini \
    && echo "xdebug.remote_connect_back=0" >> /usr/local/etc/php/php.ini \
    && echo "xdebug.remote_host=$CAKEV2_XDEBUG_REMOTE_HOST" >> /usr/local/etc/php/php.ini \
    && echo "xdebug.idekey=$CAKEV2_XDEBUG_IDEKEY" >> /usr/local/etc/php/php.ini \
    && echo "xdebug.remote_autostart=1" >> /usr/local/etc/php/php.ini \
    && echo "ServerName localhost" >> /etc/apache2/apache2.conf

RUN a2enmod rewrite

COPY host-conf/000-default.conf /etc/apache2/sites-available/000-default.conf

RUN usermod -u 1000 www-data && groupmod -g 1000 www-data

Dockerfile cho bản cakephp v4.x

#start with our base image (the foundation) - version 7.3.5
FROM php:7.3.5-apache

#install all the system dependencies and enable PHP modules
RUN apt-get update && apt-get install -y \
      libicu-dev \
      libpq-dev \
      zlib1g-dev \
      libzip-dev  \
      mysql-client \
      git \
      zip \
      unzip \
      vim \
      redis-server \
    && rm -r /var/lib/apt/lists/* \
    && docker-php-ext-configure pdo_mysql --with-pdo-mysql=mysqlnd \
    && docker-php-ext-install \
      intl \
      mbstring \
      pdo_mysql \
      pdo_pgsql \
      pgsql \
      zip \
      opcache

RUN pecl install -o -f redis \
&&  rm -rf /tmp/pear \
&&  docker-php-ext-enable redis

#install composer
RUN curl -sS https://getcomposer.org/installer | \
            php -- --install-dir=/usr/bin/ --filename=composer


#set our application folder as an environment variable
ENV APP_HOME /var/www/html

#change uid and gid of apache to docker user uid/gid
RUN usermod -u 1000 www-data && groupmod -g 1000 www-data

#change the web_root to laravel /var/www/html/public folder
RUN sed -i -e "s/html/html\/webroot/g" /etc/apache2/sites-enabled/000-default.conf

# enable apache module rewrite
RUN a2enmod rewrite

#copy source files and run composer
COPY . $APP_HOME

# install all PHP dependencies
RUN composer install --no-interaction

#change ownership of our applications
RUN chown -R www-data:www-data $APP_HOME

ARG CAKEV4_PHP_EXTENSION_XDEBUG
ARG CAKEV4_XDEBUG_REMOTE_HOST
ARG CAKEV4_XDEBUG_REMOTE_PORT
ARG CAKEV4_XDEBUG_IDEKEY

RUN echo $CAKEV4_PHP_EXTENSION_XDEBUG;
#install & config xdebug
RUN if [ $CAKEV4_PHP_EXTENSION_XDEBUG = "true" ] ; then \
    pecl install xdebug \
    && docker-php-ext-enable xdebug \
    && echo "zend_extension=$(find /usr/local/lib/php/extensions/ -name xdebug.so)" > /usr/local/etc/php/conf.d/xdebug.ini \
    && echo "xdebug.mode=debug" >> /usr/local/etc/php/conf.d/xdebug.ini \
    && echo "xdebug.discover_client_host=true" >> /usr/local/etc/php/conf.d/xdebug.ini \
    && echo "xdebug.start_with_request=yes" >> /usr/local/etc/php/conf.d/xdebug.ini \
    && echo "xdebug.discover_client_host=true" >> /usr/local/etc/php/conf.d/xdebug.ini \
    && echo "xdebug.client_host=$CAKEV4_XDEBUG_REMOTE_HOST" >> /usr/local/etc/php/conf.d/xdebug.ini \
    && echo "xdebug.client_port=$CAKEV4_XDEBUG_REMOTE_PORT" >> /usr/local/etc/php/conf.d/xdebug.ini \
    && echo "xdebug.idekey=$CAKEV4_XDEBUG_IDEKEY" >> /usr/local/etc/php/conf.d/xdebug.ini \
    ;fi

Sau khi tạo xong docker file cho 2 phần riêng thì mình tạo thêm một file docker-compose để tạo từng container cũng như liên kết các phần này vs mysql vs redis ( mình dựng cả phpmyadmin để dùng)

File docker-compose.yml như dưới đây.

version: '3'
services:
  cakephpv2:
    build:
      context: ./cakev2
      args:
        - CAKEV2_PHP_EXTENSION_XDEBUG=${CAKEV2_PHP_EXTENSION_XDEBUG}
        - CAKEV2_XDEBUG_REMOTE_HOST=${CAKEV2_XDEBUG_REMOTE_HOST}
        - CAKEV2_XDEBUG_REMOTE_PORT=${CAKEV2_XDEBUG_REMOTE_PORT}
        - CAKEV2_XDEBUG_IDEKEY=${CAKEV2_XDEBUG_REMOTE_IDEKEY}
    depends_on:
      - mysql
    links:
      - "mysql"
    ports:
      - "8765:80"
    volumes:
      - ./cakev2:/var/www/html
      - ./cakev2/host-conf:/etc/apache2/sites-available/
      - ./logs/apache-cakephpv2:/var/log/apache2/
    extra_hosts:
      - "local.card.system:127.0.0.1"
    environment:
      - SECURITY_SALT=${CAKEV2_SECURITY_SALT}
      - MYSQL_URL=${CAKEV2_MYSQL_URL}
      - MYSQL_USERNAME=${CAKEV2_MYSQL_USERNAME}
      - MYSQL_PASSWORD=${CAKEV2_MYSQL_PASSWORD}
  cakephpv4:
    build:
      context: ./main
      args:
        - CAKEV4_PHP_EXTENSION_XDEBUG=${CAKEV4_PHP_EXTENSION_XDEBUG}
        - CAKEV4_XDEBUG_REMOTE_HOST=${CAKEV4_XDEBUG_REMOTE_HOST}
        - CAKEV4_XDEBUG_REMOTE_PORT=${CAKEV4_XDEBUG_REMOTE_PORT}
        - CAKEV4_XDEBUG_IDEKEY=${CAKEV4_XDEBUG_IDEKEY}
    depends_on:
      - mysql
      - redis
    links:
      - "mysql"
      - "redis"
    ports:
      - "8766:80"
    volumes:
      - ./main:/var/www/html
      - ./main/host-conf:/etc/apache2/sites-available/
      - ./logs/apache-cakephpv4:/var/log/apache2/
    extra_hosts:
      - "local.new.card.system:127.0.0.1"
    environment:
      - SECURITY_SALT=${CAKEV4_SECURITY_SALT}
      - MYSQL_URL=${CAKEV4_MYSQL_URL}
      - MYSQL_USERNAME=${CAKEV4_MYSQL_USERNAME}
      - MYSQL_PASSWORD=${CAKEV4_MYSQL_PASSWORD}
  mysql:
    image: mysql:5.6
    volumes:
      - mysql_data:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
      - MYSQL_DATABASE=${MYSQL_DATABASE}
      - MYSQL_USER=${MYSQL_USER}
      - MYSQL_PASSWORD=${MYSQL_PASSWORD}
    ports:
      - "6033:3306"
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    links:
      - mysql
    environment:
      PMA_HOST: mysql
      PMA_PORT: 3306
      PMA_ARBITRARY: 1
      UPLOAD_LIMIT: 300M
    restart: always
    ports:
      - 8081:80
  redis:
    image: redis:4.0.5-alpine
    command: [ "redis-server", "--appendonly", "yes" ]
    hostname: redis
    volumes:
      - redis-data:/data
volumes:
    mysql_data:
    redis-data:

File .env dùng để setting các paramater cho phần docker như dưới đây( mấy cái *** thì các bạn tự điền tương ứng vs dự án của các bạn.

#cake v2
CAKEV2_PHP_EXTENSION_XDEBUG=true
CAKEV2_XDEBUG_REMOTE_HOST=10.10.0.80
CAKEV2_XDEBUG_REMOTE_PORT=9007
CAKEV2_XDEBUG_REMOTE_IDEKEY=PHPSTORM

CAKEV2_SECURITY_SALT=****
CAKEV2_MYSQL_URL=mysql
CAKEV2_MYSQL_USERNAME=root
CAKEV2_MYSQL_PASSWORD=root

#cakev4
CAKEV4_PHP_EXTENSION_XDEBUG=true
CAKEV4_XDEBUG_REMOTE_HOST=10.10.0.80
CAKEV4_XDEBUG_REMOTE_PORT=9007
CAKEV4_XDEBUG_IDEKEY=PHPSTORM
CAKEV4_MYSQL_URL=mysql
CAKEV4_MYSQL_USERNAME=root
CAKEV4_MYSQL_PASSWORD=root
CAKEV4_SECURITY_SALT=****

#mysql
MYSQL_ROOT_PASSWORD=root
MYSQL_DATABASE=cakephp
MYSQL_USER=****
MYSQL_PASSWORD=***

2. Cách cấu hình XDebug vs PHPStorm ###

Liên quan đến phần cấu hình XDebug thì các bạn chú ý đến các param có chữ XDEBUG trong tên biến.
Về cơ bản thì các paramater khsa là dễ hiểu. Có một cái chú ý là REMOTE_HOST thì các bạn phải setup đúng IP của máy mình.

Chi tiết về việc setup các paramater này như thế nào thì các bạn có thể đọc thêm ở file dockerfile tương ứng vs từng môi trường cakev2 vs cakev4.

Sau khi build hoàn chỉnh được hệ thống thì các bạn tiến hành setup trên PHPStorm ( verison của mình là phpstorm 2020.2)

  • Vào phần Refrenece > Languages & Frameworks > PHP > Debug Sửa Debug Port của Xdebug thành port 9007 ( port này được setting trong file .env). Nếu sửa thì sửa giá trị này thành giá trị set trong .env
    • Tạo 2 serveer Cakev2 vs Cakev4 như trong hình đính kèm. Chú ý sửa giá trị port vs absolute path cho đúng như trong hình.
alt text

  • Run > Edit Configuration > Add – Chọn PHP Remote Debug. Tạo tương ứng cakev2 vs cakev4 tương ứng Chú ý setting giá trị IDE Key thành giá trị mình set trong file .env lúc chạy docker ( ở đây mình để là PHPSTORM) Ấn Validate để check xe config của mình đã hoàn thành chưa.

Chúc các bạn ngày càng làm việc smart hơn

Tác giả: Đặng Văn Hiến

Trả lời Hủy

Về chúng tôi

CodeStar hướng đến việc mang lại những trải nghiệm mới cho Học viên trong mỗi buổi học thông qua việc tham gia vào các dự án tại CodeStar

Địa chỉ

Tầng 4, Tòa CT1, Bắc Hà C14, Tố Hữu, Trung Văn, Nam Từ Liêm, Hà Nội.

0367833933

[email protected]

Quick Links

Khóa học

Lịch khai giảng

Kênh Youtube

Liên hệ


Copyright © 2020. CodeStar

Search