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