本文目录导读:

PHP 项目上云是一个涉及多个层面的改造过程,不仅仅是把代码传到服务器上那么简单,根据你的部署方式(传统虚拟机、容器化、Serverless),需要调整的内容差异很大。
这里我帮你分类整理,分为必改项(不改就跑不起来)和可选项(不改也能跑,但上云没意义)。
必改项(架构与配置层)
这是从本地/IDC(互联网数据中心)环境迁移到云环境的硬指标。
数据库与缓存连接
- 本地回环地址限制:不能再用
localhost或0.0.1连接数据库(除非是同一VPC内联),必须改为云数据库(如阿里云RDS、腾讯云CDB)提供的内网域名或内网IP。 - 配置外置:数据库密码、Redis密码、密钥(Secret Key)不能再写在
config.php里提交到Git,必须改为使用环境变量(ENV) 或云厂商的密钥管理服务(如KMS)。
文件存储(最关键的一点)
- 云服务器(ECS)的本地磁盘是有状态的,如果扩容、替换实例或发生故障,存储在本地
/data/upload的文件会丢失。 - 改造动作:将上传的头像、图片、附件等,写入 OSS(对象存储),通过 CDN 分发,代码里所有涉及
move_uploaded_file写入本地目录的逻辑都需要替换为 OSS SDK 上传。
会话处理
- 默认 PHP Session 存储在
/tmp下,在云上,如果开启了多台实例负载均衡,用户会频繁掉线。 - 改造动作:将 Session 保存到 Redis 或 Memcached。
日志收集
- 日志不能只写在本地文件
storage/logs/。 - 改造动作:将日志输出到 标准输出(stdout),由云厂商的日志服务(SLS/CLS)采集;或直接接入 ELK 等日志集群。
功能优化项(代码与非功能层面)
这是为了适应云环境的弹性伸缩和故障转移。
定时任务(Crontab)的分布式锁
- 本地 IDC:只有一台机器,
crontab -e直接跑没问题。 - 云上:如果你配置了弹性伸缩(Auto Scaling),周一可能3台机器,周二流量大变成10台机器,如果不加锁,你的定时任务会同时执行10次。
- 改造动作:引入分布式锁(如Redis锁),或者使用云厂商的 Scheduled Task(如阿里云运维编排OOS)来触发任务。
全链路异步化与队列
- 上传图片后要生成缩略图?发邮件?云环境下,高峰期CPU很珍贵。
- 改造动作:将耗时操作改造为异步队列(如 RabbitMQ、Kafka 或云上的 MNS),消费者单独部署扩缩容。
应用无状态化
- 这是一个架构理念,建议彻底移除
$_SESSION依赖(改用JWT或OAuth)。 - 确保代码中不写入本地磁盘(除了临时目录
/tmp)。 - 这样做的目的是,当你将应用容器化(Docker)后,
destroy和create容器不会导致数据丢失。
容器化(Docker/K8s)特殊情况
如果你准备用 Kubernetes(K8s) 部署PHP,还需要额外处理:
- 进程管理:镜像里不能只用
php-fpm,通常还需要包含Nginx(或通过Sidecar模式)。 - 只读文件系统:容器内
/var/www/html建议设为readOnlyRootFilesystem: true,这意味着你的应用框架(如 Laravel)依赖的storage目录需要挂载到云存储或初始化时填充。 - 健康检查:需要提供
/health接口,而不能只靠端口检测。 - 优雅停机:PHP-FPM 默认不会等请求完成才终止容器,需要在
php-fpm.conf和 容器preStop钩子中配置SIGQUIT信号处理,确保长请求(如导出Excel)能跑完。
性能与安全配置(云主机侧)
这部分属于“代码不用改,配置要改”的部分。
- PHP 版本:云上建议至少使用 PHP 8.0+,PHP 7.x 已经停止安全维护,云厂商安全扫描会报警。
- 连接池:上云后,数据库连接往往有最大连接数限制(如 RDS 默认有
max_connections),建议使用phpredis或Swoole的连接池,或者使用 阿里云数据库代理(Proxy)。 - 启用 OPCache:云服务器在共享存储(NFS)下读取文件较慢,必须开启
opcache.validate_timestamps=0,并清除旧缓存代码,否则会有诡异的代码不更新问题。
云原生(Serverless)进阶
如果使用 函数计算(FC) 或 弹性容器实例(ECI):
- 禁用
file_put_contents写日志:Serverless 环境写本地磁盘会丢失且耗内存。 - PHP 环境大小:云函数冷启动时间主要在解压 PHP 运行时和依赖上,建议精简
vendor目录,或者使用容器镜像形式部署 FC 函数。
优先改这三件事
如果要排优先级,第一步先改数据库连接方式和文件存储,这决定了业务是否能在云上稳定运行;第二步改造 Session 到 Redis,这决定了能否多台机器扩容;第三步加日志收集,这决定了出故障时你能不能找到原因。
避坑提示:不要只是把云服务器当“一台有公网IP的主机”用,那样你既享受不到弹性和高可用,还要忍受云厂商的安全扫描和故障率,反而比自建机房更差。