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.
- 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