![](/img/trans.png)
[英]Unable to get Xdebug 3 working with Laravel Sail, Docker and Visual Studio Code
[英]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
並重建容器。
這就是我的做法。
cp -r vendor/laravel/sail/runtimes/8.0./resources/docker/
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。
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"]
$ ./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:
在Preferences -> Settings
下Debug
你應該檢查“Debug: Allow breakpoints anywhere”。
更改默認的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
}
]
}
在上面的海報的一些幫助下,我讓 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 請求的修復:
我有的:
我做了什么:
RUN apt-get -y install vim
docker exec -it mySite.test_1 vim /etc/php/8.0/cli/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;
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 中執行以下操作。 我認為它自己發現了許多這些設置:我不記得設置了所有這些值:
希望這會對某人有所幫助。
底層 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 和你的瀏覽器。
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_port和remote_host都非常重要。 確保此端口與容器內的服務不沖突,在這種情況下不要使用8000 ,因為 PHP 已經在此端口上運行。
你需要先在下面創建一個服務器:
文件 > 設置 > 語言和框架 > PHP > 服務器
在這種情況下正確 map 路徑非常重要: .:/var/www/html
這意味着左側的項目根目錄應該 map 到/var/www/html
現在是時候創建運行配置了。 您可以在 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.