API 斷點(diǎn)調(diào)試 -- PHPStorm && Docker && XDebug && Postman

折騰了好久,記錄一下,方便以后查閱。

環(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)試

  1. 選擇剛才的配置,設(shè)置斷點(diǎn),開啟小電話


    image
  2. 在指定域名(如 localhost)的 cookie 中添加一次 XDEBUG_SESSION=PHPSTORM


    image

    image
  3. 訪問(wèn),即可自動(dòng)跳回至 PHPstorm 的斷點(diǎn)處,可以愉快地調(diào)試了。

下一步,記錄調(diào)試的流程、快捷鍵、技巧等,敬請(qǐng)期待。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容