折騰了好久,記錄一下,方便以后查閱。
環(huán)境
- MacOS Majave version 10.14.2
- phpstorm 2018.2.2
- Docker version 18.09.1, build 4c52b90
- docker-compose version 1.23.2, build 1110ad01
- postman 6.6.1
- php 7.1.23
- xdebug v2.6.1
安裝
1. 配置文件
docker-compose.yml
# 本機(jī) 80 端口被占用,隨便改一個(gè)其他未使用端口
version: '3'
services:
fpm:
build: .
ports:
- "9111:80"
stdin_open: true
tty: true
volumes:
- .:/var/www/html
restart: always
command: "sh -c 'nginx && php-fpm'"
Dockerfile
FROM php:7.1-fpm
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
RUN sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
RUN echo 'date.timezone=PRC' > /usr/local/etc/php/conf.d/timezone.ini
# Install modules
RUN apt-get update && apt-get install -y \
git \
curl \
openssl \
wget \
vim \
procps \
libssl-dev \
libfreetype6-dev \
libjpeg62-turbo-dev \
libmcrypt-dev \
libpng-dev \
libicu-dev \
libpcre3 libpcre3-dev \
zlib1g-dev \
gnupg2 \
--no-install-recommends
# ########### nginx ################
RUN wget http://nginx.org/download/nginx-1.12.0.tar.gz -O nginx.tar.gz \
&& mkdir -p nginx \
&& tar -xf nginx.tar.gz -C nginx --strip-components=1 \
&& rm nginx.tar.gz
RUN cd nginx && ./configure \
--prefix=/etc/nginx \
--sbin-path=/usr/sbin/nginx \
--modules-path=/usr/lib/nginx/modules \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/run/nginx.lock \
--http-client-body-temp-path=/var/cache/nginx/client_temp \
--http-proxy-temp-path=/var/cache/nginx/proxy_temp \
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \
--http-scgi-temp-path=/var/cache/nginx/scgi_temp \
--user=www-data \
--group=www-data \
--with-compat \
--with-file-aio \
--with-threads \
--with-http_addition_module \
--with-http_auth_request_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_mp4_module \
--with-http_random_index_module \
--with-http_realip_module \
--with-http_secure_link_module \
--with-http_slice_module \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-http_sub_module \
--with-http_v2_module \
--with-mail \
--with-mail_ssl_module \
--with-stream \
--with-stream_realip_module \
--with-stream_ssl_module \
--with-stream_ssl_preread_module \
--with-cc-opt='-g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fPIC' \
--with-ld-opt='-Wl,-z,relro -Wl,-z,now -Wl,--as-needed -pie' \
&& make \
&& make install \
&& mkdir -p /var/cache/nginx/
# Install composer && global asset plugin
ENV COMPOSER_HOME /root/.composer
ENV PATH /root/.composer/vendor/bin:$PATH
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer \
&& composer config -g repo.packagist composer https://packagist.phpcomposer.com
#install extension
RUN docker-php-ext-install zip \
&& docker-php-ext-install mcrypt \
&& docker-php-ext-install intl \
&& docker-php-ext-install mbstring \
&& docker-php-ext-install pdo_mysql \
&& docker-php-ext-install pcntl \
&& docker-php-ext-install bcmath
#install gd
RUN docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
&& docker-php-ext-install gd
# redis
RUN wget http://pecl.php.net/get/redis-3.1.6.tgz \
&& pecl install redis-3.1.6.tgz \
&& rm -f redis-3.1.6.tgz \
&& docker-php-ext-enable redis
# amqp
RUN apt install librabbitmq-dev -y
RUN wget https://github.com/alanxz/rabbitmq-c/releases/download/v0.8.0/rabbitmq-c-0.8.0.tar.gz -O rabbitmq.tar.gz \
&& mkdir -p rabbitmq \
&& tar -xf rabbitmq.tar.gz -C rabbitmq --strip-components=1 \
&& rm rabbitmq.tar.gz \
&& cd rabbitmq \
&& ./configure --prefix=/usr/local/rabbitmq-dev \
&& make \
&& make install \
&& cd .. \
&& rm -rf rabbitmq
RUN wget http://pecl.php.net/get/amqp-1.9.3.tgz -O amqp.tar.gz \
&& mkdir -p amqp \
&& tar -xf amqp.tar.gz -C amqp --strip-components=1 \
&& rm amqp.tar.gz \
&& cd amqp \
&& phpize \
&& ./configure --with-php-config=/usr/local/bin/php-config --with-amqp --with-librabbitmq-dir=/usr/local/rabbitmq-dev \
&& make -j$(nproc) \
&& make install \
&& docker-php-ext-enable amqp
# tideways
RUN git clone https://github.com/tideways/php-profiler-extension.git \
&& cd php-profiler-extension \ tideways_xhprof --strip-components=1 \
&& phpize \
&& ./configure \
&& make \
&& make install
# xdebug 重點(diǎn)看這里即可
RUN yes | pecl install xdebug \
&& echo "zend_extension=$(find /usr/local/lib/php/extensions/ -name xdebug.so)" > /usr/local/etc/php/conf.d/xdebug.ini \
&& echo "xdebug.remote_enable=on" >> /usr/local/etc/php/conf.d/xdebug.ini \
&& echo "xdebug.remote_autostart=on" >> /usr/local/etc/php/conf.d/xdebug.ini \
&& echo "xdebug.remote_port=9211" >> /usr/local/etc/php/conf.d/xdebug.ini \
&& echo "xdebug.remote_host=192.168.0.103" >> /usr/local/etc/php/conf.d/xdebug.ini
RUN apt-get purge -y g++ \
&& apt-get autoremove -y \
&& rm -r /var/lib/apt/lists/* \
&& rm -rf /tmp/*
WORKDIR /var/www/html
COPY ./nginx.conf /etc/nginx/nginx.conf
COPY ./local.ini /usr/local/php/conf/
RUN echo 'date.timezone=PRC' > /usr/local/etc/php/conf.d/timezone.ini
RUN usermod -u 1000 www-data
EXPOSE 80 443
CMD ["sh", '-c', 'nginx && php-fpm']
重點(diǎn)關(guān)注 xdebug 一段的安裝及配置,相當(dāng)于
; Enable xdebug extension module
zend_extension=$(find /usr/local/lib/php/extensions/ -name xdebug.so)
xdebug.idekey = "PHPSTORM"
; 因?yàn)镈BGp調(diào)試代理是可以做調(diào)試分發(fā)的,所以,定義一個(gè)IDEKEY,目的是讓調(diào)試器知道,是不是發(fā)給自己的請(qǐng)求
xdebug.remote_enable = 1
; 設(shè)置為1的時(shí)候,會(huì)先參數(shù)鏈接到remote_host和remote_port指定的調(diào)試器端口,如果連接不上,就繼續(xù)執(zhí)行,類似設(shè)置>了0
xdebug.remote_mode = "req"
xdebug.remote_handler = "dbgp"
; 也就是調(diào)試走哪種協(xié)議,有老的PHP3協(xié)議,也有GDB協(xié)議,DBGP是當(dāng)前的默認(rèn)協(xié)議,也是當(dāng)前主流支持的協(xié)議
xdebug.remote_connect_back = 0
; 如果為1,xdebug會(huì)通過(guò)$_SERVER[‘REMOTE_ADDR’]變量,向發(fā)起HTTP請(qǐng)求的客戶端發(fā)起鏈接,和remote_host功能類似>,但是優(yōu)先級(jí)比remote_host高,所以,設(shè)置了這個(gè)選項(xiàng)就會(huì)忽略remote_host,由于我的運(yùn)行時(shí)服務(wù)器不能主動(dòng)鏈接IDE所>在PC,所以不能開啟自動(dòng)回連模式(內(nèi)網(wǎng)訪問(wèn)外網(wǎng)的網(wǎng)頁(yè),也不能開啟)
# 剛開始這里配置錯(cuò)了,怎么樣都不行。。。
xdebug.remote_host = "192.168.0.103"
; 默認(rèn)是主機(jī),如果服務(wù)器可以直接你的本地電腦,可以直接填寫本機(jī)ip,我這里使用xshell做tcp轉(zhuǎn)發(fā)
xdebug.remote_port = 9211
; 默認(rèn)端口是9000,由于端口被fpm占用,我修改為9211,建議沒(méi)有端口沖突時(shí)不修改
xdebug.remote_autostart = 0
; 這個(gè)為1,會(huì)忽略COOKIE或者POST/GET中帶的XDEBUG_SESSION參數(shù),不管有沒(méi)有,都會(huì)啟動(dòng)調(diào)試,所以,還是設(shè)置為0比較好,默認(rèn)0
local.ini
post_max_size = 256m
upload_max_filesize = 256m
nginx.conf
user www-data;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/json;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
gzip on;
## PHP-FPM Servers ##
upstream php-fpm {
server localhost:9000;
}
server {
listen 80;
server_name localhost;
root "/var/www/html/";
client_max_body_size 32m;
location / {
index index.php;
if (!-e $request_filename){
rewrite ^/(.*) /index.php last;
}
}
location ~ ^(.+\.php)(.*)$ {
fastcgi_index index.php;
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
fastcgi_pass php-fpm;
client_max_body_size 100m;
include fastcgi_params;
add_header Access-Control-Allow-Origin "*";
}
}
}
2. 安裝及驗(yàn)證
docker 環(huán)境
# 安裝
docker-compose build
# 啟動(dòng)
docker-compose up -d
# 查看容器狀態(tài)
docker-compose ps
# 進(jìn)入容器
docker-compose exec fpm bash
# 查看
php -v
PHP 7.1.23 (cli) (built: Oct 16 2018 01:08:49) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies
with Xdebug v2.6.1, Copyright (c) 2002-2018, by Derick Rethans
# 可以看到PHP已正確安裝,且 xdebug 擴(kuò)展已開啟
# 新建 index.php 文件,在宿主機(jī)瀏覽器直接訪問(wèn),得到結(jié)果,表示 nginx 已正確配置
# 我這里 docker 虛擬機(jī)配置的端口為 9111
curl http://localhost:9111
配置 PHPstorm
首先配置 PHPstorm 使用的 CLI 解釋器為 docker 虛擬機(jī)內(nèi)的 PHP

image

image
配置 xdebug 端口

image
Run -> Edit Configuration 或者 或者點(diǎn)擊 PHPstorm 右上角的 Edit Configuration

image

image
瀏覽器調(diào)試,安裝對(duì)應(yīng)的擴(kuò)展即可,略
postman 斷點(diǎn)調(diào)試
-
選擇剛才的配置,設(shè)置斷點(diǎn),開啟小電話
image -
在指定域名(如 localhost)的 cookie 中添加一次 XDEBUG_SESSION=PHPSTORM
image
image - 訪問(wèn),即可自動(dòng)跳回至 PHPstorm 的斷點(diǎn)處,可以愉快地調(diào)試了。
下一步,記錄調(diào)試的流程、快捷鍵、技巧等,敬請(qǐng)期待。


