在 PHP 解释器、PhpStorm 2020.3、Laravel 8 中未检测到 PHP

问题描述

我想做什么:

我正在尝试在 Laravel 8 上的 PHPStorm 2020.3 中运行/调试单元测试。ENV 是 Windows 10 上的 WSL 2。

问题

一:当我在 CLI 解释器中选择服务时,没有检测到 PHP 和 Xdebug。

enter image description here

两个:当我运行/调试单元测试时,出现不同的错误,其中之一:

[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

解决方法

令我惊讶的是,通过将 version 文件中的 docker-compose.yml 指定为:

version: '3.9'
services:
  laravel.test:
    build:
      context: ./docker/development
      dockerfile: Dockerfile
      args:
...

参考:https://youtrack.jetbrains.com/issue/PY-38394