跳转到主内容
websoft网络软件专家 - 深耕网络技术,打造实用软件!

PHP CI/CD流水线:GitHub Actions完整配置指南

PHP项目CI/CD正确触发事件为push仅限main、release/、hotfix/,pull_request仅针对main和release/**目标分支;需用shivammathur/setup-php@v2显式启用PDO等扩展;composer install须加--no-interaction --prefer-dist --no-suggest,并区分--no-dev用于CD阶段。 PHP项目触发CI/CD的正确事件写法 PHP项目通常不需要像前端那样监听
pull_request
的所有分支,更常见的是只在
main
(或
master
)和发布分支(如
release/*
)上运行完整流程。盲目加
develop
或通配符容易导致测试资源浪费或敏感操作误触发。 推荐写法是分层控制:
push
触发全部:仅限
main
、
release/**
、
hotfix/**
pull_request
仅做轻量检查:只针对
main
和
release/**
目标分支,避免 PR 指向
develop
时也跑全量测试 不建议用
schedule
定时跑 PHP CI,除非你明确需要每日扫描依赖漏洞(此时应单独拆 workflow) PHP版本与扩展的精准匹配 GitHub Actions 默认 Ubuntu 运行器自带的 PHP 版本有限,且
ext-opcache
、
ext-pdo_pgsql
等扩展默认不启用。直接写
php --version
可能显示 8.2,但
php -m
里却找不到关键模块,导致本地能跑、CI 报
Class 'PDO' not found
。 正确做法是显式安装扩展: 立即学习 “ PHP免费学习笔记(深入) ”; GitHub Copilot GitHub AI编程工具,实时编程建议 下载 用
shivammathur/setup-php@v2
替代原生
setup-php
,它支持扩展一键启用 在
with
中声明所需扩展:
extensions: mbstring, xml, curl, pdo, pdo_mysql, opcache
若项目依赖 PostgreSQL,必须加
pgsql
和
pdo_pgsql
,否则
composer install
可能跳过相关包,后续运行时报错 示例片段:
steps: - name: Setup PHP uses: shivammathur/setup-php@v2 with: php-version: '8.2' extensions: mbstring, xml, curl, pdo, pdo_mysql, opcache
Composer install 在 CI 中的三个坑
composer install
在 CI 中不是“照搬本地命令”就行。常见失败点集中在缓存、权限和依赖解析上。 别用
composer install --no-interaction
就完事——缺少
--prefer-dist
会导致下载源码包,慢且易因 GitHub API 限流失败 必须加
--no-suggest
,否则某些包会输出交互提示,在无 TTY 的 CI 环境中卡住 如果项目用了私有 Packagist(如 Satis 或 Private Packagist),需提前配置
auth.json
并用
actions/upload-artifact
+
actions/download-artifact
传入,不能硬编码 token 到 workflow 强烈建议用
composer install --no-dev
在 CD 阶段执行,避免把
phpunit
等开发依赖打进生产镜像 部署到 PHP 服务器时的路径与权限陷阱 用
appleboy/scp-action
或
rsync
推送代码后,常出现 500 错误或空白页,问题往往不在 PHP 本身,而在文件权限和用户上下文。 SCP 默认以
SERVER_USER
身份写入,但 Web 服务(如 nginx + php -fpm)通常以
www-data
用户运行,导致
storage/logs
不可写 解决办法:部署后加一步
ssh
执行
chown -R www-data:www-data /var/www/myapp
和
chmod -R 755 /var/www/myapp/storage
别在 workflow 里直接
sudo systemctl restart php-fpm
—— 大多数共享主机或最小化系统没装 systemd;改用
touch /var/www/myapp/storage/restart.txt
配合 fpm 的
pm.status_path
或健康检查脚本更稳妥 若用 Laravel,记得同步
.env
文件——它不该进 Git,但必须通过 secrets 注入并安全写入服务器 最后提醒一句:PHP 的
opcache.revalidate_freq
在 CI 部署后若设为 0,可能让新代码不生效;上线前确认该值 ≥60,或手动
opcache_reset()
。这个细节,90% 的配置模板都漏掉。

相关文章