You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Mac Docker环境下Laravel的Pest测试运行极慢求助

Laravel Docker化后Pest测试速度骤降的解决思路

问题背景

本地开发Laravel应用时,Pest测试仅需3秒完成,但Docker化后耗时超1分钟。以下是当前的Docker配置:

Dockerfile配置

FROM php:8.1.12-fpm

ARG uid=1000
ARG user=macgiver

RUN apt-get update && apt-get install -y \
    git \
    curl \
    libpng-dev \
    libonig-dev \
    libxml2-dev \
    zip \
    unzip

# Install and enable xDebug
RUN pecl install xdebug \
    && docker-php-ext-enable xdebug

RUN apt-get clean && rm -rf /var/lib/apt/lists/*

# Install php modules required by laravel.
RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd

# Create system user to run Composer and Artisan commands.
RUN useradd -G www-data,root -u $uid -d /home/$user $user
RUN mkdir -p /home/$user/.composer && \
    chown -R $user:$user /home/$user

# Install composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

# Set working directory
WORKDIR /var/www

USER $user

docker-compose.yml配置

version: "3.9"
services:
  app:
    build:
      context: ./
      dockerfile: Dockerfile
    image: dmc
    container_name: dmc-app
    restart: unless-stopped
    working_dir: /var/www/
    depends_on:
      - db
      - nginx
    volumes:
      - ./:/var/www/
      - ./docker/php/conf.d/xdebug.ini:/usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
      - ./docker/php/conf.d/error_reporting.ini:/usr/local/etc/php/conf.d/error_reporting.ini
    expose:
      - "9003"
    networks:
      - dmc-net

  nginx:
    image: nginx:1.23.2-alpine
    container_name: dmc-nginx
    restart: unless-stopped
    ports:
      - "8000:80"
    volumes:
      - ./:/var/www
      - ./docker-compose/nginx:/etc/nginx/conf.d
    networks:
      - dmc-net

  db:
    image: mysql:8.0.31
    container_name: dmc-db
    restart: unless-stopped
    # using 3307 on the host machine to avoid collisions in case there's a local MySQL instance installed already.
    ports:
      - "3307:3306"
    # use the variables declared in .env file
    environment:
      MYSQL_HOST: ${DB_HOST}
      MYSQL_DATABASE: ${DB_DATABASE}
      MYSQL_PASSWORD: ${DB_PASSWORD}
      MYSQL_ROOT_PASSWORD: abcd1234
      MYSQL_USER: ${DB_USERNAME}
      SERVICE_TAGS: dev
      SERVICE_NAME: mysql
    volumes:
      - ./docker-compose/mysql:/docker-entrypoint-initdb.d
      - mysql-data:/var/lib/mysql
    networks:
      - dmc-net

networks:
  dmc-net:
    driver: bridge

volumes:
  mysql-data:

解决思路

  • 关掉Xdebug:Xdebug是调试工具,跑测试时完全不需要,它会严重拖慢PHP执行速度。要么直接在Dockerfile里删掉Xdebug的安装与启用代码,要么测试时临时禁用——比如执行php -d xdebug.mode=off vendor/bin/pest,或者在xdebug.ini里添加xdebug.mode=off。
  • 优化挂载卷性能:本地目录挂载到容器的IO性能在Windows/macOS上本来就差,建议只挂载必要目录,而非整个项目根目录;或者给挂载卷加cached参数,把app服务的卷配置改成- ./:/var/www:cached,能缓解文件读写慢的问题。
  • 换用SQLite跑测试:测试没必要依赖MySQL,Laravel支持切换到内存版SQLite,速度会提升很多。在.env.testing里配置:
    DB_CONNECTION=sqlite
    DB_DATABASE=:memory:
    
  • 优化MySQL配置:如果必须用MySQL,给db服务添加性能优化参数,比如在environment中加入:
    MYSQL_INITDB_ARGS="--innodb-buffer-pool-size=256M --query-cache-type=1 --query-cache-size=64M"
    
  • 把依赖包打包进镜像:避免通过挂载卷共享vendor目录,在Dockerfile里添加RUN composer install命令,把依赖直接装到镜像里,减少跨文件系统的IO开销。

内容的提问来源于stack exchange,提问作者MrCujo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 06:35:29