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。
正确做法是显式安装扩展:
生成周报:读取本机 Git 仓库最近一周的提交记录,按项目分类提炼总结,生成标准周报格式,通过微信推送并返回给用户。触发词:周报、weekly report、git总结、提交记录总结、工作周报。
- 用
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% 的配置模板都漏掉。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










