本文目录导读:

- 核心思路
- 基础:使用 Composer 脚本(最常用)
- 专业级:使用 Robo(基于 PHP 的任务运行器)
- 代码质量自动化(静态分析与格式化)
- CI/CD 流程自动化(以 GitHub Actions 为例)
- 部署自动化(使用 Deployer)
- 总结:如何选择?
为PHP项目编写自动化脚本,通常涉及任务运行器(Task Runner)、持续集成(CI)、代码质量检查、测试和部署等方面。
以下是几种主流且高效的实现方式,从简单到复杂,从本地到服务器,供你选择。
核心思路
- 本地自动化:使用任务运行器(如 Make, Robo, Phing)或 Composer 脚本。
- 代码质量自动化:集成 PHP_CodeSniffer, PHPStan, PHPMD 等工具。
- 测试自动化:PHPUnit, Pest。
- CI/CD 自动化:使用 GitHub Actions, GitLab CI, Jenkins 等。
- 部署自动化:Deployer, Capistrano。
基础:使用 Composer 脚本(最常用)
Composer 自带脚本功能,可以快速实现简单的自动化任务,只需要在 composer.json 的 scripts 部分定义命令。
步骤:
-
修改
composer.json:{ "name": "your/project", "require": { "php": "^8.1" }, "require-dev": { "phpunit/phpunit": "^10.0", "squizlabs/php_codesniffer": "^3.7", "phpstan/phpstan": "^1.10" }, "scripts": { // 测试 "test": "phpunit", // 代码风格检查 (lint) "cs": "phpcs --standard=PSR12 src/ tests/", // 静态分析 "analyse": "phpstan analyse src/ --level=max", // 清理缓存(示例) "clear-cache": "rm -rf var/cache/*", // 组合命令(用 && 连接) "check": [ "@cs", "@analyse", "@test" ], // 运行在 dev 环境,自动执行一些初始化操作 "post-install-cmd": [ "YourNamespace\\YourScript::clearCache" // 也可以调用 PHP 类 ], // 自动生成 IDE 帮助文件 "post-update-cmd": [ "php artisan ide-helper:generate" ] }, "autoload": { "psr-4": { "YourNamespace\\": "src/" } } } -
运行脚本:
# 运行测试 composer test # 运行全部检查 composer check # 运行自定义脚本(等价于 php -r 'echo 1;') composer run-script clear-cache
优点:零额外依赖,集成在 Composer 中,适合小型项目或快速任务。
缺点:不支持复杂逻辑(如分支、循环、文件观察)。
专业级:使用 Robo(基于 PHP 的任务运行器)
如果你需要比 Composer 脚本更强大、更清晰的自动化,可以使用 Robo 或 Phing。
使用 Robo 的步骤:
-
安装:
composer require --dev consolidation/robo
-
创建 RoboFile.php(放在项目根目录):
<?php use Robo\Tasks; class RoboFile extends Tasks { // 定义任务命令,方法名即命令名,如 robo test public function test(array $args = ['--testsuite=default']): void { $this->taskExec('phpunit') ->args($args) ->run(); } public function check(): void { // 并行执行多个任务 $this->stopOnFail(false); $this->taskParallelExec() ->process('phpcs --standard=PSR12 src/ tests/') ->process('phpstan analyse src/ --level=max') ->process('phpunit') ->run(); } public function deploy(): void { // 模拟部署流程:打包 -> 上传 -> 解压 $this->say('Starting deployment...'); $this->taskExec('tar czf /tmp/build.tar.gz --exclude=vendor .') ->run(); $this->taskRsync() ->fromPath('/tmp/build.tar.gz') ->toHost('user@server.com') ->toPath('/var/www/html/') ->run(); $this->taskExec('ssh user@server.com "cd /var/www/html && tar xzf build.tar.gz && rm build.tar.gz"') ->run(); $this->say('Deployment complete!'); } // 文件监听(自动测试) public function watch(): void { $this->taskWatch() ->monitor('src/', function () { $this->test(); // 文件变化时自动运行测试 }) ->run(); } } -
运行命令:
# 运行测试 vendor/bin/robo test # 运行代码检查 vendor/bin/robo check # 启动文件监听 vendor/bin/robo watch
优点:纯 PHP 编写,语法直观,支持并行、文件监听、SSH、Git 操作等,可读性强。
缺点:需要安装一个额外的 PHP 包,对于非常简单的任务可能稍显笨重。
代码质量自动化(静态分析与格式化)
这些都是编写自动化脚本时常用的“小工具”,把它们集成到上述脚本中。
自动格式化(PHP CS Fixer 或 Pint)
-
PHP CS Fixer:
composer require --dev friendsofphp/php-cs-fixer # 在脚本中调用 vendor/bin/php-cs-fixer fix src/ --rules=@PSR12
-
Laravel Pint(如果使用 Laravel):
composer require --dev laravel/pint # 自动修复 vendor/bin/pint
静态分析(PHPStan 或 Psalm)
- PHPStan:
composer require --dev phpstan/phpstan # 运行 phpstan analyse --memory-limit=2G src/
代码安全检查
- Psalm(Taint Analysis)可以检测 SQL 注入、XSS 等。
- PHP Insights(代码质量雷达图):
composer require --dev nunomaduro/phpinsights vendor/bin/phpinsights analyse src/ --min-quality=90
CI/CD 流程自动化(以 GitHub Actions 为例)
将上述脚本集成到 CI 中,实现“提交代码即自动检查”。
创建 .github/workflows/php-ci.yml:
name: PHP CI
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
# 配置 PHP 版本矩阵
strategy:
matrix:
php-versions: ['8.1', '8.2', '8.3']
steps:
- uses: actions/checkout@v4
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php-versions }}
coverage: xdebug # 开启覆盖率统计
- name: Install Dependencies
run: composer install --prefer-dist --no-progress --no-suggest
- name: Check Code Style
run: vendor/bin/phpcs --standard=PSR12 --colors src/ tests/
- name: Static Analysis (PHPStan)
run: vendor/bin/phpstan analyse --no-progress src/
- name: Run Tests (PHPUnit with coverage)
run: vendor/bin/phpunit --coverage-text --coverage-clover=coverage.xml
# 可选:将测试覆盖率上传到 Codecov
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v3
with:
token: ${{ secrets.CODECOV_TOKEN }}
files: ./coverage.xml
verbose: true
效果:每次 Push 或 PR 时,GitHub 会自动执行安装依赖、代码风格检查、PHPStan 分析、单元测试和覆盖率统计。
部署自动化(使用 Deployer)
对于部署到服务器的场景,Deployer 是最流行的 PHP 部署工具。
步骤:
-
安装:
composer require --dev deployer/deployer
-
创建
deploy.php:<?php namespace Deployer; require 'recipe/common.php'; // 项目名称 set('application', 'my_php_app'); // 仓库地址 set('repository', 'git@github.com:your/repo.git'); // 服务器配置 host('production') ->setHostname('your-server.com') ->setRemoteUser('deploy') ->setDeployPath('/var/www/html/my_app') // 部署路径 ->setIdentityFile('~/.ssh/deploy_key') // SSH 密钥 ->setSshArguments(['-o UserKnownHostsFile=/dev/null']); // 部署后执行的任务 task('deploy', [ 'deploy:info', 'deploy:prepare', 'deploy:lock', 'deploy:release', 'deploy:update_code', // 拉取最新代码 'deploy:shared', // 创建共享文件(如 .env, storage) 'deploy:writable', // 设置写权限 'deploy:vendors', // 运行 composer install 'deploy:clear_paths', // 清理不需要的文件 'deploy:symlink', // 创建软链接到当前版本 'deploy:unlock', 'cleanup', // 保留最近 5 个版本,删除旧的 ]); // 部署后自动运行迁移和缓存清理 after('deploy:symlink', 'artisan:migrate'); // 如果是 Laravel after('deploy:symlink', 'custom:cache_clear'); // 定义自定义任务 task('custom:cache_clear', function () { run('php {{release_or_current_path}}/artisan cache:clear'); }); -
一键部署:
vendor/bin/dep deploy production
优点:支持零停机发布、回滚、多环境配置、并发部署。
缺点:需要配置 SSH 访问,学习曲线稍高于 Composer 脚本。
如何选择?
| 场景 | 推荐工具 | 理由 |
|---|---|---|
| 只想快速检查代码风格和测试 | Composer scripts |
零配置,足够用 |
| 需要复杂流程(如并行、文件监听、SSH) | Robo 或 Phing | 代码可读性强,功能丰富 |
| 需要团队统一代码规范和自动化测试 | PHP CS Fixer + PHPStan + PHPUnit | 行业标准组合 |
| 需要 CI/CD 自动化 | GitHub Actions / GitLab CI | 云端执行,无需维护服务器 |
| 需要自动化部署到正式服务器 | Deployer | 专为 PHP 部署设计,零停机 |
最佳实践建议:
- 小项目:
composer.json scripts+phpunit+phpcs。 - 中型项目:
Robo+PHPStan+PHP CS Fixer+GitHub Actions。 - 大型或商业项目:
Deployer+Robo+CI+静态分析+代码覆盖率。
重要提示:请确保将 vendor/bin/ 目录下的工具添加到 PATH 中,或者使用 vendor/bin/你的命令 的方式运行,建议在 pre-commit git hook 中运行自动化检查(可以使用 husky 或直接写 bash 脚本),防止不合规代码被提交。