PHP 未在 PHP 解释器、PhpStorm 2020.3、Laravel 8 中检测到
PHP is not detected in PHP Interpreters, PhpStorm 2020.3, Laravel 8
我想做什么:
我正尝试 run/debug 在 Laravel 8 上的 PhpStorm 2020.3 中进行单元测试。环境是 Windows 10 上的 WSL 2。
问题
一个: PHP 当我在 CLI 解释器中 select 服务时,没有检测到 Xdebug。
两个: 当我 run/debug 单元测试时,我得到不同的错误,其中之一:
[docker-compose://[\wsl$\Ubuntu-20.04\home\musa\codes\boom\finance\docker-compose.yml]:laravel.test/]:php /opt/.phpstorm_helpers/phpunit.php --configuration /var/www/html/phpunit.xml
Testing started at 8:31 PM ...
Version mismatch: file \wsl$\Ubuntu-20.04\home\musa\codes\xyz\docker-compose.yml specifies version 3.9 but extension file C:\Users\musah\AppData\Local\JetBrains\PhpStorm2020.3\tmp\docker-compose.override.9.yml uses version 1
Process finished with exit code 1
如果我能解决第一个问题,我想第二个问题就会得到解决。
详情:
docker-compose.yml
文件:
services:
laravel.test:
build:
context: ./docker/development
dockerfile: Dockerfile
args:
WWWGROUP: '${WWWGROUP:-wwwdata}'
image: sail-8.0/app
ports:
- '${APP_PORT:-80}:80'
- '9003:9003'
environment:
WWWUSER: '${WWWUSER:-wwwdata}'
LARAVEL_SAIL: 1
volumes:
- '.:/var/www/html'
- './docker/development/xdebug.ini:/usr/local/etc/php/conf.d/php-ext-xdebug.ini'
- './docker/development/php.ini:/usr/local/etc/php/conf.d/99-sail.ini'
- './docker/development/http.conf:/etc/apache2/sites-available/000-default.conf'
- './docker/development/supervisord.conf:/etc/supervisor/conf.d/supervisord.conf'
networks:
- sail
depends_on:
- mysql
- redis
- selenium
mysql:
image: mysql:5.7.29
restart: unless-stopped
tty: true
ports:
- '${FORWARD_DB_PORT:-3306}:3306'
volumes:
- ./docker/development/mysql:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
MYSQL_DATABASE: '${DB_DATABASE}'
MYSQL_USER: '${DB_USERNAME}'
MYSQL_PASSWORD: '${DB_PASSWORD}'
MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
SERVICE_NAME: mysql
networks:
- sail
healthcheck:
test: ["CMD", "mysqladmin", "ping"]
redis:
image: 'redis:alpine'
ports:
- '${FORWARD_REDIS_PORT:-6379}:6379'
volumes:
- 'sailredis:/data'
networks:
- sail
healthcheck:
test: ["CMD", "redis-cli", "ping"]
mailhog:
image: 'mailhog/mailhog:latest'
ports:
- '${FORWARD_MAILHOG_PORT:-1025}:1025'
- '${FORWARD_MAILHOG_DASHBOARD_PORT:-8025}:8025'
networks:
- sail
selenium:
image: 'selenium/standalone-chrome:latest'
volumes:
- '/dev/shm:/dev/shm'
networks:
- sail
localstack:
image: localstack/localstack:latest
environment:
- AWS_DEFAULT_REGION=us-east-1
- EDGE_PORT=4566
- SERVICES=lambda,s3
ports:
- '4566:4566'
volumes:
- "${TMPDIR:-/tmp/localstack}:/tmp/localstack"
- "/var/run/docker.sock:/var/run/docker.sock"
networks:
- sail
networks:
sail:
driver: bridge
volumes:
sailmysql:
driver: local
sailredis:
driver: local
sailmeilisearch:
driver: local
docker/development/Dockerfile
文件:
FROM php:8.0-apache
ARG WWWGROUP
WORKDIR /var/www/html
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update \
&& apt-get install -y curl zip unzip supervisor libcap2-bin libpng-dev python2 \
&& php -r "readfile('http://getcomposer.org/installer');" | php -- --install-dir=/usr/bin/ --filename=composer \
&& apt-get -y autoremove \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
RUN pecl install xdebug && docker-php-ext-enable xdebug
RUN setcap "cap_net_bind_service=+ep" /usr/local/bin/php
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
RUN chmod +x /usr/local/bin/start-container
EXPOSE 8000
EXPOSE 9003
ENTRYPOINT ["start-container"]
docker/development/php.ini
文件:
[PHP]
post_max_size = 100M
upload_max_filesize = 100M
variables_order = EGPCS
docker/development/xdebug.ini
文件:
[XDebug]
xdebug.mode = debug
xdebug.start_with_request = yes
xdebug.client_host = host.docker.internal
xdebug.client_port = 9003
xdebug.log = "/tmp/xdebug.log"
docker/development/supervisord.conf
文件:
[supervisord]
nodaemon=true
user=root
logfile=/var/log/supervisor/supervisord.log
pidfile=/var/run/supervisord.pid
[program:php]
command=/usr/local/bin/php -d variables_order=EGPCS /var/www/html/artisan serve --host=0.0.0.0 --port=80
user=sail
environment=LARAVEL_SAIL="1"
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
docker/development/start-container
文件:
#!/usr/bin/env bash
if [ ! -z "$WWWUSER" ]; then
usermod -u $WWWUSER sail
fi
if [ ! -d /.composer ]; then
mkdir /.composer
fi
chmod -R ugo+rw /.composer
if [ $# -gt 0 ];then
exec gosu $WWWUSER "$@"
else
/usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.conf
fi
令我惊讶的是,通过将 docker-compose.yml
文件中的 version
指定为:
,这两个问题都得到了解决
version: '3.9'
services:
laravel.test:
build:
context: ./docker/development
dockerfile: Dockerfile
args:
...
我想做什么:
我正尝试 run/debug 在 Laravel 8 上的 PhpStorm 2020.3 中进行单元测试。环境是 Windows 10 上的 WSL 2。
问题
一个: PHP 当我在 CLI 解释器中 select 服务时,没有检测到 Xdebug。
两个: 当我 run/debug 单元测试时,我得到不同的错误,其中之一:
[docker-compose://[\wsl$\Ubuntu-20.04\home\musa\codes\boom\finance\docker-compose.yml]:laravel.test/]:php /opt/.phpstorm_helpers/phpunit.php --configuration /var/www/html/phpunit.xml
Testing started at 8:31 PM ...
Version mismatch: file \wsl$\Ubuntu-20.04\home\musa\codes\xyz\docker-compose.yml specifies version 3.9 but extension file C:\Users\musah\AppData\Local\JetBrains\PhpStorm2020.3\tmp\docker-compose.override.9.yml uses version 1
Process finished with exit code 1
如果我能解决第一个问题,我想第二个问题就会得到解决。
详情:
docker-compose.yml
文件:
services:
laravel.test:
build:
context: ./docker/development
dockerfile: Dockerfile
args:
WWWGROUP: '${WWWGROUP:-wwwdata}'
image: sail-8.0/app
ports:
- '${APP_PORT:-80}:80'
- '9003:9003'
environment:
WWWUSER: '${WWWUSER:-wwwdata}'
LARAVEL_SAIL: 1
volumes:
- '.:/var/www/html'
- './docker/development/xdebug.ini:/usr/local/etc/php/conf.d/php-ext-xdebug.ini'
- './docker/development/php.ini:/usr/local/etc/php/conf.d/99-sail.ini'
- './docker/development/http.conf:/etc/apache2/sites-available/000-default.conf'
- './docker/development/supervisord.conf:/etc/supervisor/conf.d/supervisord.conf'
networks:
- sail
depends_on:
- mysql
- redis
- selenium
mysql:
image: mysql:5.7.29
restart: unless-stopped
tty: true
ports:
- '${FORWARD_DB_PORT:-3306}:3306'
volumes:
- ./docker/development/mysql:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
MYSQL_DATABASE: '${DB_DATABASE}'
MYSQL_USER: '${DB_USERNAME}'
MYSQL_PASSWORD: '${DB_PASSWORD}'
MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
SERVICE_NAME: mysql
networks:
- sail
healthcheck:
test: ["CMD", "mysqladmin", "ping"]
redis:
image: 'redis:alpine'
ports:
- '${FORWARD_REDIS_PORT:-6379}:6379'
volumes:
- 'sailredis:/data'
networks:
- sail
healthcheck:
test: ["CMD", "redis-cli", "ping"]
mailhog:
image: 'mailhog/mailhog:latest'
ports:
- '${FORWARD_MAILHOG_PORT:-1025}:1025'
- '${FORWARD_MAILHOG_DASHBOARD_PORT:-8025}:8025'
networks:
- sail
selenium:
image: 'selenium/standalone-chrome:latest'
volumes:
- '/dev/shm:/dev/shm'
networks:
- sail
localstack:
image: localstack/localstack:latest
environment:
- AWS_DEFAULT_REGION=us-east-1
- EDGE_PORT=4566
- SERVICES=lambda,s3
ports:
- '4566:4566'
volumes:
- "${TMPDIR:-/tmp/localstack}:/tmp/localstack"
- "/var/run/docker.sock:/var/run/docker.sock"
networks:
- sail
networks:
sail:
driver: bridge
volumes:
sailmysql:
driver: local
sailredis:
driver: local
sailmeilisearch:
driver: local
docker/development/Dockerfile
文件:
FROM php:8.0-apache
ARG WWWGROUP
WORKDIR /var/www/html
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update \
&& apt-get install -y curl zip unzip supervisor libcap2-bin libpng-dev python2 \
&& php -r "readfile('http://getcomposer.org/installer');" | php -- --install-dir=/usr/bin/ --filename=composer \
&& apt-get -y autoremove \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
RUN pecl install xdebug && docker-php-ext-enable xdebug
RUN setcap "cap_net_bind_service=+ep" /usr/local/bin/php
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
RUN chmod +x /usr/local/bin/start-container
EXPOSE 8000
EXPOSE 9003
ENTRYPOINT ["start-container"]
docker/development/php.ini
文件:
[PHP]
post_max_size = 100M
upload_max_filesize = 100M
variables_order = EGPCS
docker/development/xdebug.ini
文件:
[XDebug]
xdebug.mode = debug
xdebug.start_with_request = yes
xdebug.client_host = host.docker.internal
xdebug.client_port = 9003
xdebug.log = "/tmp/xdebug.log"
docker/development/supervisord.conf
文件:
[supervisord]
nodaemon=true
user=root
logfile=/var/log/supervisor/supervisord.log
pidfile=/var/run/supervisord.pid
[program:php]
command=/usr/local/bin/php -d variables_order=EGPCS /var/www/html/artisan serve --host=0.0.0.0 --port=80
user=sail
environment=LARAVEL_SAIL="1"
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
docker/development/start-container
文件:
#!/usr/bin/env bash
if [ ! -z "$WWWUSER" ]; then
usermod -u $WWWUSER sail
fi
if [ ! -d /.composer ]; then
mkdir /.composer
fi
chmod -R ugo+rw /.composer
if [ $# -gt 0 ];then
exec gosu $WWWUSER "$@"
else
/usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.conf
fi
令我惊讶的是,通过将 docker-compose.yml
文件中的 version
指定为:
version: '3.9'
services:
laravel.test:
build:
context: ./docker/development
dockerfile: Dockerfile
args:
...