如何为PHP项目编写自动化脚本?

wen PHP项目 3

本文目录导读:

如何为PHP项目编写自动化脚本?

  1. 核心思路
  2. 基础:使用 Composer 脚本(最常用)
  3. 专业级:使用 Robo(基于 PHP 的任务运行器)
  4. 代码质量自动化(静态分析与格式化)
  5. CI/CD 流程自动化(以 GitHub Actions 为例)
  6. 部署自动化(使用 Deployer)
  7. 总结:如何选择?

为PHP项目编写自动化脚本,通常涉及任务运行器(Task Runner)持续集成(CI)代码质量检查测试部署等方面。

以下是几种主流且高效的实现方式,从简单到复杂,从本地到服务器,供你选择。

核心思路

  1. 本地自动化:使用任务运行器(如 Make, Robo, Phing)或 Composer 脚本。
  2. 代码质量自动化:集成 PHP_CodeSniffer, PHPStan, PHPMD 等工具。
  3. 测试自动化:PHPUnit, Pest。
  4. CI/CD 自动化:使用 GitHub Actions, GitLab CI, Jenkins 等。
  5. 部署自动化:Deployer, Capistrano。

基础:使用 Composer 脚本(最常用)

Composer 自带脚本功能,可以快速实现简单的自动化任务,只需要在 composer.jsonscripts 部分定义命令。

步骤:

  1. 修改 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/"
            }
        }
    }
  2. 运行脚本

    # 运行测试
    composer test
    # 运行全部检查
    composer check
    # 运行自定义脚本(等价于 php -r 'echo 1;')
    composer run-script clear-cache

优点:零额外依赖,集成在 Composer 中,适合小型项目或快速任务。
缺点:不支持复杂逻辑(如分支、循环、文件观察)。


专业级:使用 Robo(基于 PHP 的任务运行器)

如果你需要比 Composer 脚本更强大、更清晰的自动化,可以使用 RoboPhing

使用 Robo 的步骤:

  1. 安装

    composer require --dev consolidation/robo
  2. 创建 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();
        }
    }
  3. 运行命令

    # 运行测试
    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 部署工具。

步骤:

  1. 安装

    composer require --dev deployer/deployer
  2. 创建 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');
    });
  3. 一键部署

    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 部署设计,零停机

最佳实践建议:

  1. 小项目composer.json scripts + phpunit + phpcs
  2. 中型项目Robo + PHPStan + PHP CS Fixer + GitHub Actions
  3. 大型或商业项目Deployer + Robo + CI + 静态分析 + 代码覆盖率

重要提示:请确保将 vendor/bin/ 目录下的工具添加到 PATH 中,或者使用 vendor/bin/你的命令 的方式运行,建议在 pre-commit git hook 中运行自动化检查(可以使用 husky 或直接写 bash 脚本),防止不合规代码被提交。

抱歉,评论功能暂时关闭!