关于 ddev-expert
ddev-expert 是面向 PHP 项目开发者的 DDEV 参考技能,内容尤其涵盖 Drupal。它整理项目配置、常用命令、性能调整和故障排查方法。
主要功能
- 01DDEV 项目生命周期命令
- 02Drupal 10 和 11 配置指南
- 03数据库导入、导出与快照
- 04自定义服务和 PHP 配置
- 05Xdebug 与性能调整
- 06故障排查和 CI 示例
适用场景
- 01启动本地 Drupal 开发项目
- 02向现有项目导入数据库
- 03为 DDEV 添加 Redis 或 Solr 服务
- 04排查容器或数据库问题
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ madsnorgaard/ drupal-agent-resources --skill ddev-expert安装后在 Claude Code 中输入/ddev-expert确认已加载。
详细介绍
DDEV 开发专家
你是 DDEV 专家,精通用于 PHP 项目的基于 Docker 的本地开发环境。
核心概念
DDEV 提供一致的容器化本地开发环境,包含:
- 预配置的 PHP、Web 服务器和数据库容器
- 使用 mkcert 自动配置 HTTPS
- 内置 Composer 和 Node.js 支持
- 轻松管理多个项目
注意: 默认不包含 Drush——创建 Drupal 项目后,必须执行 composer require drush/drush。
常用命令
项目管理
ddev start # Start project containers
ddev stop # Stop project containers
ddev restart # Restart containers
ddev poweroff # Stop all DDEV projects
ddev delete # Remove project (keeps files)
执行命令
ddev drush <cmd> # Run Drush commands
ddev composer <cmd> # Run Composer
ddev php <script> # Run PHP scripts
ddev exec <cmd> # Run any command in web container
ddev ssh # SSH into web container
数据库
ddev mysql # MySQL CLI
ddev export-db # Export database
ddev import-db # Import database (--file=dump.sql)
ddev snapshot # Create database snapshot
ddev restore # Restore from snapshot
实用工具
ddev describe # Show project info and URLs
ddev logs # View container logs
ddev launch # Open site in browser
ddev share # Create public URL (ngrok)
配置
.ddev/config.yaml
name: my-project
type: drupal # Auto-detects Drupal version, or use drupal11/drupal10
docroot: web
php_version: "8.3" # Use 8.3 for Drupal 11, 8.2 for Drupal 10
webserver_type: nginx-fpm
database:
type: mariadb
version: "10.11"
# Additional hostnames
additional_hostnames:
- api.my-project.ddev.site
# Extra PHP packages
webimage_extra_packages: [php8.3-imagick]
常见自定义配置
自定义服务(.ddev/docker-compose.*.yaml):
version: '3.6'
services:
redis:
image: redis:7
container_name: ddev-${DDEV_SITENAME}-redis
labels:
com.ddev.site-name: ${DDEV_SITENAME}
expose:
- "6379"
PHP 覆盖配置(.ddev/php/my-settings.ini):
memory_limit = 512M
upload_max_filesize = 64M
post_max_size = 64M
Nginx 配置(.ddev/nginx_full/nginx-site.conf): 用于特殊路由需求的自定义 Nginx 配置。
Drupal 专属设置
新建 Drupal 11 项目
mkdir my-drupal && cd my-drupal
ddev config --project-type=drupal --docroot=web --php-version=8.3
ddev start
ddev composer create-project drupal/recommended-project:^11
ddev composer require drush/drush
ddev drush site:install --account-name=admin --account-pass=admin -y
ddev launch
重要说明:
ddev composer create-project需要空目录——先移走所有现有文件(如.claude/),完成后再移回来- Drupal 11 的 recommended-project 不包含 Drush——务必单独安装
- 使用
--project-type=drupal(自动检测版本)或明确指定drupal11
新建 Drupal 10 项目
mkdir my-drupal && cd my-drupal
ddev config --project-type=drupal --docroot=web --php-version=8.2
ddev start
ddev composer create-project drupal/recommended-project:^10
ddev composer require drush/drush
ddev drush site:install --account-name=admin --account-pass=admin -y
ddev launch
现有 Drupal 项目
cd existing-project
ddev config --project-type=drupal --docroot=web
ddev start
ddev composer install
ddev import-db --file=database.sql.gz
ddev drush cr
故障排除
常见问题
ddev composer create-project 因 "not allowed to be present" 失败:
# This happens when extra directories exist (like .claude/, .git/, etc.)
# Solution: Move them out temporarily
mv .claude /tmp/claude-backup
mv .git /tmp/git-backup
ddev composer create-project drupal/recommended-project:^11
mv /tmp/claude-backup .claude
mv /tmp/git-backup .git
端口冲突:
ddev poweroff
# Check what's using ports 80/443
sudo lsof -i :80
容器问题:
ddev restart
ddev debug refresh # Rebuild containers
ddev delete && ddev start # Nuclear option
数据库连接问题:
- 主机:
db(容器内)或127.0.0.1:PORT(容器外) - 使用
ddev describe检查端口
权限问题:
ddev exec chown -R $(id -u):$(id -g) .
实用调试命令
ddev debug capabilities # Show DDEV capabilities
ddev debug router # Show router status
ddev logs -f # Follow logs
ddev exec env # Show environment variables
多环境工作流
使用 ddev pull
在 .ddev/providers/ 中配置提供商:
# .ddev/providers/platform.yaml
environment_variables:
project: my-project
environment: main
db_pull_command:
command: platform db:dump -e ${environment}
然后执行:ddev pull platform
Xdebug 配置
启用 Xdebug
ddev xdebug on # Enable step debugging
ddev xdebug off # Disable (faster performance)
ddev xdebug status # Check current state
IDE 配置
VS Code(搭配 PHP Debug 扩展):
// .vscode/launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "Listen for Xdebug",
"type": "php",
"request": "launch",
"port": 9003,
"pathMappings": {
"/var/www/html": "${workspaceFolder}"
}
}
]
}
PHPStorm:
- 设置 → PHP → 服务器
- 添加服务器:名称与 DDEV 项目名称一致
- 主机:
<project>.ddev.site,端口:443,HTTPS - 路径映射:项目根目录 →
/var/www/html
Xdebug 模式
# .ddev/php/xdebug.ini
[xdebug]
xdebug.mode=debug,develop,coverage
模式:debug(单步调试)、develop(增强错误信息)、coverage(代码覆盖率)、profile(性能分析)
自定义服务
Redis
# .ddev/docker-compose.redis.yaml
services:
redis:
image: redis:7-alpine
container_name: ddev-${DDEV_SITENAME}-redis
labels:
com.ddev.site-name: ${DDEV_SITENAME}
com.ddev.approot: $DDEV_APPROOT
expose:
- "6379"
volumes:
- redis-data:/data
volumes:
redis-data:
Drupal settings.php:
$settings['redis.connection']['host'] = 'redis';
$settings['redis.connection']['port'] = 6379;
$settings['cache']['default'] = 'cache.backend.redis';
Solr
# .ddev/docker-compose.solr.yaml
services:
solr:
image: solr:9
container_name: ddev-${DDEV_SITENAME}-solr
labels:
com.ddev.site-name: ${DDEV_SITENAME}
com.ddev.approot: $DDEV_APPROOT
expose:
- "8983"
volumes:
- solr-data:/var/solr
command: solr-precreate drupal
volumes:
solr-data:
访问 Solr:ddev describe 会显示 URL,通常为 https://<project>.ddev.site:8983
Elasticsearch
# .ddev/docker-compose.elasticsearch.yaml
services:
elasticsearch:
image: elasticsearch:8.11.0
container_name: ddev-${DDEV_SITENAME}-elasticsearch
labels:
com.ddev.site-name: ${DDEV_SITENAME}
com.ddev.approot: $DDEV_APPROOT
environment:
- discovery.type=single-node
- xpack.security.enabled=false
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
expose:
- "9200"
volumes:
- elasticsearch-data:/usr/share/elasticsearch/data
volumes:
elasticsearch-data:
Mailpit(邮件测试)
DDEV 默认包含 Mailpit:
ddev launch -m # Open Mailpit UI
所有发出的邮件都会被捕获到 https://<project>.ddev.site:8026
性能调优
Mutagen(macOS/Windows)
Mutagen 可加快文件同步,从而提升性能:
# Enable globally
ddev config global --mutagen-enabled
# Or per-project in .ddev/config.yaml
mutagen_enabled: true
适用 Mutagen 的场景:
- 使用大型代码库(vendor、node_modules)的 macOS
- 使用 WSL2 的 Windows
- 文件 I/O 较慢的项目
Mutagen 命令:
ddev mutagen status # Check sync status
ddev mutagen sync # Force sync
ddev mutagen reset # Reset if issues
NFS(macOS 替代方案)
在 macOS 上不使用 Mutagen 时:
ddev config global --nfs-mount-enabled
性能提示
-
从同步中排除不必要的文件:
# .ddev/config.yaml upload_dirs: - sites/default/files -
将 tmpfs 用于临时文件:
# .ddev/docker-compose.performance.yaml services: web: tmpfs: - /tmp -
为大型操作增加 PHP 内存:
# .ddev/php/performance.ini memory_limit = 1024M
自定义 DDEV 命令
在 .ddev/commands/ 中创建项目专属命令:
# .ddev/commands/web/refresh
#!/bin/bash
## Description: Full site refresh (db + config + cache)
## Usage: refresh
## Example: ddev refresh
set -e
echo "Importing database..."
drush sql:drop -y
drush sql:cli < /var/www/html/reference.sql
echo "Importing config..."
drush config:import -y
echo "Running updates..."
drush updatedb -y
echo "Clearing cache..."
drush cache:rebuild
echo "Done!"
设置为可执行:chmod +x .ddev/commands/web/refresh
然后运行:ddev refresh
命令位置
.ddev/commands/web/- 在 Web 容器中运行.ddev/commands/host/- 在主机上运行.ddev/commands/db/- 在数据库容器中运行
CI/CD 集成
GitHub Actions
# .github/workflows/test.yml
name: Tests
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup DDEV
uses: ddev/github-action-setup-ddev@v1
- name: Start DDEV
run: ddev start
- name: Install dependencies
run: ddev composer install
- name: Run tests
run: ddev exec ./vendor/bin/phpunit
GitLab CI
# .gitlab-ci.yml
test:
image: ddev/ddev-gitpod-base:latest
services:
- docker:dind
variables:
DOCKER_HOST: tcp://docker:2375
script:
- ddev start
- ddev composer install
- ddev exec ./vendor/bin/phpunit
最佳实践
- 提交 .ddev 文件夹(.ddev/db_snapshots 除外,.ddev/.gitignore 已对此进行处理)
- 使用 .ddev/config.local.yaml 添加个人覆盖配置(已加入 git 忽略)
- 在项目 README 中记录自定义服务
- 执行有风险的数据库操作前创建快照
- 保持 DDEV 更新:
ddev self-upgrade - 在 macOS/Windows 上使用 Mutagen,以获得更佳性能
- 为重复性任务创建自定义命令
- 在 CI 中测试 DDEV 配置,及早发现问题