簡體   English   中英

在 laravel 上運行 Xdebug docker Windows PhpStorm

[英]Run Xdebug on laravel sail docker Windows PhpStorm

因此,經過數小時的谷歌搜索,沒有找到正確的答案。 我已經開始使用 Docker 和 Laravel 的風帆為 Windows 安裝 Laravel 8.x 教程。

現在我想使用 Xdebug 並且完全不知道該怎么做。

在項目的根目錄中有一個 docker-compose.yml (這是默認值)

# For more information: https://laravel.com/docs/sail
version: '3'
services:
    laravel.test:
        build:
            context: ./vendor/laravel/sail/runtimes/8.0
            dockerfile: Dockerfile
            args:
                WWWGROUP: '${WWWGROUP}'
        image: sail-8.0/app
        ports:
            - '${APP_PORT:-80}:80'
        environment:
            WWWUSER: '${WWWUSER}'
            LARAVEL_SAIL: 1
            PHP_IDE_CONFIG: 'serverName=localhost'
        volumes:
            - '.:/var/www/html'
        networks:
            - sail
        depends_on:
            - mysql
            - redis
            # - selenium
    # selenium:
    #     image: 'selenium/standalone-chrome'
    #     volumes:
    #         - '/dev/shm:/dev/shm'
    #     networks:
    #         - sail
    #     depends_on:
    #         - laravel.test
    mysql:
        image: 'mysql:8.0'
        ports:
            - '${DB_PORT}:3306'
        environment:
            MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
            MYSQL_DATABASE: '${DB_DATABASE}'
            MYSQL_USER: '${DB_USERNAME}'
            MYSQL_PASSWORD: '${DB_PASSWORD}'
            MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
        volumes:
            - 'sailmysql:/var/lib/mysql'
        networks:
            - sail
    redis:
        image: 'redis:alpine'
        ports:
            - '${REDIS_PORT}:6379'
        volumes:
            - 'sailredis:/data'
        networks:
            - sail
    # memcached:
    #     image: 'memcached:alpine'
    #     ports:
    #         - '11211:11211'
    #     networks:
    #         - sail
    mailhog:
        image: 'mailhog/mailhog:latest'
        ports:
            - 1025:1025
            - 8025:8025
        networks:
            - sail
networks:
    sail:
        driver: bridge
volumes:
    sailmysql:
        driver: local
    sailredis:
        driver: local

在 vendor/laravel/sail/runtimes/8.0 文件夾中有一個 Dockerfile

FROM ubuntu:20.04

LABEL maintainer="Taylor Otwell"

ARG WWWGROUP

WORKDIR /var/www/html

ENV DEBIAN_FRONTEND noninteractive
ENV TZ=UTC

RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

RUN apt-get update \
    && apt-get install -y gnupg gosu curl ca-certificates zip unzip git supervisor sqlite3 libcap2-bin \
    && mkdir -p ~/.gnupg \
    && echo "disable-ipv6" >> ~/.gnupg/dirmngr.conf \
    && apt-key adv --homedir ~/.gnupg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys E5267A6C \
    && apt-key adv --homedir ~/.gnupg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys C300EE8C \
    && echo "deb http://ppa.launchpad.net/ondrej/php/ubuntu focal main" > /etc/apt/sources.list.d/ppa_ondrej_php.list \
    && apt-get update \
    && apt-get install -y php8.0-cli php8.0-dev \
       php8.0-pgsql php8.0-sqlite3 php8.0-gd \
       php8.0-curl php8.0-memcached \
       php8.0-imap php8.0-mysql php8.0-mbstring \
       php8.0-xml php8.0-zip php8.0-bcmath php8.0-soap \
       php8.0-intl php8.0-readline \
       php8.0-msgpack php8.0-igbinary php8.0-ldap \
       php8.0-redis \
    && php -r "readfile('http://getcomposer.org/installer');" | php -- --install-dir=/usr/bin/ --filename=composer \
    && curl -sL https://deb.nodesource.com/setup_15.x | bash - \
    && apt-get install -y nodejs \
    && apt-get -y autoremove \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

RUN setcap "cap_net_bind_service=+ep" /usr/bin/php8.0

RUN groupadd --force -g $WWWGROUP sail
RUN useradd -ms /bin/bash --no-user-group -g $WWWGROUP -u 1337 sail

COPY start-container /usr/local/bin/start-container
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
COPY php.ini /etc/php/8.0/cli/conf.d/99-sail.ini

RUN chmod +x /usr/local/bin/start-container

EXPOSE 8000

ENTRYPOINT ["start-container"]

怎么辦? 我在 Windows 系統上我想將它連接到 PhpStorm

我在 Linux 工作站上遇到了同樣的問題。

也許我的解決方案也對你有用。

顯然,Laravel Sail 根本沒有安裝 XDebug。 為了包含它,您必須修改Dockerfile ,編輯docker-compose.yml並重建容器。

這就是我的做法。

  1. 我復制了 Docker 配置 Laravel Sail 使用在更方便的地方:

cp -r vendor/laravel/sail/runtimes/8.0./resources/docker/

  1. 我更改了context並在docker-compose.yml的第一行中的args下添加了一個變量:
# For more information: https://laravel.com/docs/sail
version: '3'
services:
    laravel.test:
        build:
            context: ./resources/docker/8.0
            dockerfile: Dockerfile
            args:
                WWWGROUP: '${WWWGROUP}'
                XDEBUG: ${APP_DEBUG}

...

所以context指向我復制原始 Docker 配置的位置。 我還決定將新的XDEBUG arg 綁定到.env文件中的APP_DEBUG變量的值,以便在生產環境中關閉 XDebug。

  1. 然后,我更改了之前復制的Dockerfile ,以便在構建容器時包含 xdebug。 該腳本還應該在php.ini中為 Xdebug 3 編寫正確的配置選項:
FROM ubuntu:20.04

LABEL maintainer="Taylor Otwell"

ARG WWWGROUP
ARG XDEBUG

WORKDIR /var/www/html

ENV DEBIAN_FRONTEND noninteractive
ENV TZ=UTC

RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

RUN apt-get update \
    && apt-get install -y gnupg gosu curl ca-certificates zip unzip git supervisor sqlite3 libcap2-bin \
    && mkdir -p ~/.gnupg \
    && echo "disable-ipv6" >> ~/.gnupg/dirmngr.conf \
    && apt-key adv --homedir ~/.gnupg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys E5267A6C \
    && apt-key adv --homedir ~/.gnupg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys C300EE8C \
    && echo "deb http://ppa.launchpad.net/ondrej/php/ubuntu focal main" > /etc/apt/sources.list.d/ppa_ondrej_php.list \
    && apt-get update \
    && apt-get install -y php8.0-cli php8.0-dev \
       php8.0-pgsql php8.0-sqlite3 php8.0-gd \
       php8.0-curl php8.0-memcached \
       php8.0-imap php8.0-mysql php8.0-mbstring \
       php8.0-xml php8.0-zip php8.0-bcmath php8.0-soap \
       php8.0-intl php8.0-readline \
       php8.0-msgpack php8.0-igbinary php8.0-ldap \
       php8.0-redis

RUN if [ ${XDEBUG} ] ; then \
    apt-get install -y php-xdebug \
    && echo "[XDebug]" > /etc/php/8.0/cli/php.ini \
    && echo "zend_extension="$(find /usr/lib/php/20200930/ -name xdebug.so)" > /etc/php/8.0/cli/php.ini" \
    && echo "xdebug.mode = debug" >> /etc/php/8.0/cli/php.ini \
    && echo "xdebug.start_with_request = yes" >> /etc/php/8.0/cli/php.ini \
    && echo "xdebug.discover_client_host = true" >> /etc/php/8.0/cli/php.ini ;\
fi;

RUN php -r "readfile('http://getcomposer.org/installer');" | php -- --install-dir=/usr/bin/ --filename=composer \
    && curl -sL https://deb.nodesource.com/setup_15.x | bash - \
    && apt-get install -y nodejs \
    && apt-get -y autoremove \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*


RUN setcap "cap_net_bind_service=+ep" /usr/bin/php8.0

RUN groupadd --force -g $WWWGROUP sail
RUN useradd -ms /bin/bash --no-user-group -g $WWWGROUP -u 1337 sail

COPY start-container /usr/local/bin/start-container
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
COPY php.ini /etc/php/8.0/cli/conf.d/99-sail.ini
RUN chmod +x /usr/local/bin/start-container

EXPOSE 8000

ENTRYPOINT ["start-container"]

  1. 停止、重建和重新啟動容器后:
$ ./vendor/bin/sail stop
$ ./vendor/bin/sail up --build -d

您可以查看 XDebug 是否正在運行:

$ ./vendor/bin/sail php -v
PHP 8.0.0 (cli) (built: Nov 27 2020 12:26:22) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.0-dev, Copyright (c) Zend Technologies
    with Zend OPcache v8.0.0, Copyright (c), by Zend Technologies
    with Xdebug v3.0.1, Copyright (c) 2002-2020, by Derick Rethans

僅適用於 VSCode:

  1. Preferences -> SettingsDebug你應該檢查“Debug: Allow breakpoints anywhere”。

  2. 更改默認的launch.json文件:

{
  // Use IntelliSense to learn about possible attributes.
  // Hover to view descriptions of existing attributes.
  // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Listen for XDebug",
      "type": "php",
      "request": "launch",
      "port": 9003,
      "pathMappings": {
          "/var/www/html" : "${workspaceFolder}"
      }
    },
    {
      "name": "Launch currently open script",
      "type": "php",
      "request": "launch",
      "program": "${file}",
      "cwd": "${fileDirname}",
      "port": 9000
    }
  ]
}

在 laravel/sail(PHP 7.4 和 PHP 8)中有一個廢棄的 PR 用於可選的 Xdebug 3.0 支持。 關注討論

檢查提交Dockerfiledocker-compose.yml. 不要忘記在 your.env 中設置變量

在上面的海報的一些幫助下,我讓 XDebug 可以處理 web 請求。

我對 PHPStorm 和 XDebug 2.x 有相當多的經驗。 我是 docker 的新手,所以可能有更好的方法來解決這個問題。 我還沒有弄清楚如何運行或調試依賴於 PHPStorm 內部的數據庫連接的測試(右鍵單擊要調試的測試)。 如果我“聽” sail test (它將正確運行測試),它們會成功運行斷點,但 PHPStorm 在運行測試時找不到 MySQL 數據庫,我也收到此錯誤:“Xdebug:[Step Debug] 無法連接到調試客戶端。嘗試:host.docker.internal:9003"

更新 1/18/21 以修復 PHPStorm 中的本地環境,以便它可以找到數據庫和 Docker 網絡的 rest。 現在我可以在 PHPStorm 中成功運行測試和調試。 使用 PHPStorm 2020.3.1 的當前版本,您需要在它要求網絡模式的地方添加網絡名稱 我將向他們報告此問題,以便盡快解決。

通過運行docker network ls獲取您的網絡名稱。 在這種情況下,它是 myProjectName_sail。

NETWORK ID     NAME                             DRIVER    SCOPE
8e8635ce01a6   bridge                           bridge    local
401307dbfaad   host                             host      local
ad8020ad629e   myProjectName_sail               bridge    local
d85a9668cade   none                             null      local

在 PHPStorm Preferences>PHP>CLI Interpreter>...中輸入這個

在此處輸入圖像描述

關於調試 web 請求的修復:

我有的:

  • Laravel 風帆版8.0
  • Xdebug 3.0 版
  • PHPStorm 版本 2020.3 PHPStorm 的版本很重要,因為它支持 PHP8 和 Xdedbug 3。

我做了什么:

  • 我通過將此行添加到 Dockerfile: RUN apt-get -y install vim
  • 這讓我可以通過運行docker exec -it mySite.test_1 vim /etc/php/8.0/cli/php.ini輕松查看/編輯文件。
  • 在這種情況下,我仍然編輯了 Dockerfile 以生成 php.ini

你需要讓你的/etc/php/8.0/cli/php.ini文件看起來像這樣(client_host 是關鍵):

[XDebug]
xdebug.mode = debug
xdebug.start_with_request = yes
xdebug.client_host = host.docker.internal

我按照@Enea74 的建議將此添加到 Dockerfile 中。 我無法讓條件返回 TRUE,所以我現在在這里硬編碼TRUE

RUN if [ true ] ; then \
    apt-get install -y php-xdebug \
    && echo "[XDebug]" > /etc/php/8.0/cli/php.ini \
    && echo "zend_extension="$(find /usr/lib/php/20200930/ -name xdebug.so)" > /etc/php/8.0/cli/php.ini" \
    && echo "xdebug.mode = debug" >> /etc/php/8.0/cli/php.ini \
    && echo "xdebug.start_with_request = yes" >> /etc/php/8.0/cli/php.ini \
    && echo "xdebug.client_host = host.docker.internal" >> /etc/php/8.0/cli/php.ini ;\
fi;
  • 我通過運行sails sail build --no-cache構建了Docker 容器
  • 然后sail up -d

sail php -v返回:

PHP 8.0.0 (cli) (built: Nov 27 2020 12:26:22) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.0-dev, Copyright (c) Zend Technologies
    with Zend OPcache v8.0.0, Copyright (c), by Zend Technologies
    with Xdebug v3.0.1, Copyright (c) 2002-2020, by Derick Rethans

現在在 PHPStorm 中執行以下操作。 我認為它自己發現了許多這些設置:我不記得設置了所有這些值:

為 Sail 添加 CLI 解釋器

驗證 Xdebug 安裝

設置泊塢窗

希望這會對某人有所幫助。

底層 dockerfile 可以在這里找到。

為了運行 xdebug,您需要安裝 PHP 擴展。 我個人喜歡使用docker-php-extension-installer來安裝它們。

在第 35 行之后添加這些行:

RUN sudo apt-get install php-xdebug
在第 35 行之后添加這些行:
 RUN sudo apt-get install php-xdebug

之后你需要配置 Xdebug、PhpStorm 和你的瀏覽器。

  1. 配置 xdebug 以連接到您的主機

xdebug.ini

 zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20180731/xdebug.so xdebug.remote_host=host.docker.internal xdebug.remote_enable=1 xdebug.remote_autostart=1 xdebug.remote_port=9000 xdebug.idekey=PHPSTORM

remote_portremote_host都非常重要。 確保此端口與容器內的服務不沖突,在這種情況下不要使用8000 ,因為 PHP 已經在此端口上運行。

  1. 配置 PhpStorm

你需要先在下面創建一個服務器:

文件 > 設置 > 語言和框架 > PHP > 服務器

在此處輸入圖像描述

在這種情況下正確 map 路徑非常重要: .:/var/www/html

這意味着左側的項目根目錄應該 map 到/var/www/html

現在是時候創建運行配置了。 您可以在 PhpStorm 右上角的“添加配置...”下執行此操作

在此處輸入圖像描述

使用屏幕截圖作為指導。

  1. 最后在瀏覽器中啟動調試 session ,最簡單的方法是使用 chrome 擴展Xdebug helper 更改之前在設置下配置的 IDE 密鑰,然后左鍵單擊擴展圖標 > 調試以開始調試。

在右上角的 PhpStorm 中也執行相同的操作。 在此處輸入圖像描述

我對@Enea74 和@smenzer 的貢獻如下:

我在 linux mint 上成功地使用 xdebug 配置了 Sail。

但是當我運行一些 phpUnit 或風帆測試時,它沒有按預期工作並收到此消息

Xdebug:[Step Debug] 無法連接到調試客戶端。 試過:host.docker.internal:9000(通過xdebug.client_host/xdebug.client_port回退):-(

經過長時間的搜索,我發現需要在 apt install 命令之后在 Sail 的 Dockerfile 上添加這一行:

RUN ip -4 路由列表匹配 0/0 | awk '{打印 $3" 主機.docker.internal"}' >> /etc/hosts

重建容器

揚帆起航

揚帆起航 --build --force-recreate -d

然后 xdebug 開始使用 phpunit 測試 shell 以及正常的瀏覽器導航。

注意:如果命令 'ip' 不起作用,請在之前的 apt install 命令中添加 package 'iproute2'。

我的情況與 OP 相同,但沒有找到解決方案,但這就是我發現的:

如果您最近通過命令行安裝了 xdebug,那么您很可能安裝了 Xdebug V3,它的配置選項與 Xdebug V2 不同。 它沒有 remote_autostart 或 remote_enable 選項,因此設置它們將無效。

您可以在此處閱讀有關 Xdebug 3 配置選項的更多信息: https://xdebug.org/docs/all_settings

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM