ThinkPHP8项目上云需将数据库和文件存储迁移至阿里云RDS与OSS:配置database.php连接RDS,启用PDO严格模式;安装OSS SDK并配置filesystem.php;通过.env切换磁盘或显式调用Storage::disk('oss')实现上传;最后验证迁移效果。

在ThinkPHP8项目中把数据库和文件存储迁移到阿里云RDS与OSS,是上云最关键的两步——本地MySQL必须停用,所有上传文件不能再存服务器硬盘。
配置ThinkPHP8连接阿里云RDS MySQL
第一步:登录阿里云RDS控制台,找到已创建的MySQL实例,点击“基本信息”,复制【连接地址(内网)】、端口、数据库名、高权限账号及密码。注意:内网地址仅限同VPC下的ECS访问,若本地调试需开通外网地址并设置白名单IP。
第二步:打开ThinkPHP8项目根目录下的config/database.php,定位到'mysql'配置块,将'hostname'改为RDS内网连接地址(如rds-xxx.mysql.rds.aliyuncs.com),'hostport'填控制台显示的端口号(默认3306),'database'填你创建的数据库名,'username'和'password'填高权限账号凭证。
第三步:关键校验——把'deploy'设为1,强制启用PDO的PDO::ATTR_EMULATE_PREPARES关闭模式;否则RDS MySQL 8.0+的严格模式会拒绝部分INSERT语句。这步漏掉会导致批量插入报错“Field 'xxx' doesn't have a default value”。
安装并注册阿里云OSS SDK驱动
执行命令安装官方SDK:composer require aliyuncs/oss-sdk-php。安装完成后,vendor目录下必须出现aliyuncs/oss-sdk-php子目录,否则后续初始化会抛出Class not found异常。
在config/filesystem.php中,于'disks'数组末尾新增OSS磁盘配置:
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
'oss' => [ 'type' => 'oss', 'access_key_id' => env('OSS_ACCESS_KEY_ID'), 'access_key_secret' => env('OSS_ACCESS_KEY_SECRET'), 'bucket' => env('OSS_BUCKET'), 'endpoint' => env('OSS_ENDPOINT'), 'timeout' => 3600, 'connect_timeout' => 10, 'cdn_domain' => env('OSS_CDN_DOMAIN', ''),],
注意'endpoint'必须填OSS控制台Bucket详情页里的“Endpoint(外网)”或“Endpoint(内网)”,不能填OSS控制台首页URL,也不能漏掉https://前缀——填错会导致Curl error 6 Failed to connect。
将上传逻辑无缝切换至OSS
方法一:全局替换上传驱动
在.env文件中修改FILESYSTEM_DISK=oss。此操作会让所有调用Storage::put()、Storage::upload()的地方自动走OSS,无需改业务代码。但前提是你的上传路径已按OSS要求规范命名——例如不能含../或以/开头的绝对路径。
方法二:按需指定磁盘
在控制器中显式调用:Storage::disk('oss')->put('uploads/'.date('Y/m/d').'/'.uniqid().'.'.$ext, $file->getRealPath());。这一步必须用$file->getRealPath()而非$file->path(),因为后者返回临时文件绝对路径,OSS SDK内部会尝试fopen该路径,而Windows下路径分隔符不兼容会导致Warning: failed to open stream。
方法三:重写上传验证器规则
在app/validate/FileUpload.php中,将原本限制max:2048的size规则,同步追加file和mimes:jpg,png,gif,防止恶意用户上传PHP脚本——OSS本身不校验文件类型,全靠应用层拦截。
验证RDS与OSS是否生效
① 执行php think migrate:run,观察终端输出是否显示“Migrated: xxx_create_users_table”。若报错“SQLSTATE[HY000] [1045] Access denied”,说明RDS账号密码或网络策略未通。
② 在浏览器上传一张测试图片,查看Network面板中上传请求的响应体,确认返回的URL域名包含.oss-字样(如https://my-bucket.oss-cn-hangzhou.aliyuncs.com/...),而非http://your-domain.com/storage/...。
③ 登录OSS控制台→对应Bucket→文件列表,找到刚上传的文件,点击右侧“复制文件URL”,粘贴到新标签页打开——能直接显示图片即代表OSS公网读取权限已正确配置。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










