昨天夜里两点,站点转移我把一个跑了三年的站点转移thinkphp站点从阿里云迁到了腾讯云。不是站点转移闲得慌,是站点转移客户嫌备案麻烦,非要把域名换到香港节点。站点转移整个迁移过程比预想中顺利,站点转移但也踩了几个thinkphp特有的站点转移坑,写出来给后来人提个醒。站点转移
先说最核心的站点转移——别急着拷文件。thinkphp项目里runtime目录下缓存了一堆编译文件和日志,站点转移直接打包带过去,站点转移轻则报错,站点转移重则白屏。站点转移我习惯先删掉runtime下的站点转移所有子目录,只保留一个空的站点转移runtime文件夹,并确认它有写权限。这一步能省掉后面大半的排错时间。
文件传上去之后,紧接着改配置。thinkphp的配置文件分散在application目录下,但真正容易忽略的是根目录的.env文件,或者config/database.php里的数据库连接信息。我这次就栽在这上面——数据库密码改了,但config里还留着旧密码,结果首页能开,登录接口全部500。排查了二十分钟,最后用命令行php think clear清缓存才想起来去翻数据库配置。
说到命令行,thinkphp的迁移有个隐形福利:自带脚手架。你可以在旧服务器上执行php think build自动生成模块结构,然后只把application下的控制器和模型传过去,会比整包搬运干净得多。但前提是你没在代码里写死绝对路径。我见过有人用__DIR__拼路径,搬到新环境后目录层级一变就崩。所以迁移前全局搜索一下“/var/www”或者“D:\”这类硬编码路径,替换成相对路径或者用thinkphp的ROOT_PATH常量。
静态资源是另一个坑点。thinkphp默认把public目录当web根目录,但很多人图省事把整个项目放在nginx的root下。迁移后务必检查伪静态规则——thinkphp的URL重写依赖pathinfo模式,nginx里少写一行try_files就会让你所有非首页的链接全部404。我这次花了半小时才想起来旧服务器用的是apache,.htaccess规则在nginx下根本不生效,得手动转成nginx的location配置。
最后说个容易被忽略的小细节:时区。thinkphp默认时区是PRC,但香港节点的服务器默认可能是UTC。如果你代码里用了date('Y-m-d H:i:s')而不是thinkphp的助手函数,会出现时间差八小时的问题。别问我是怎么知道的——客户半夜打电话说订单时间显示错了,我爬起来改config/app.php里的default_timezone,顺手把代码里所有date()替换成了date_format()。
迁移完别急着收工。用php think route:list检查一下路由是否正常,再用curl测试几个带参数的GET请求。thinkphp的调试模式在迁移后默认是关闭的,如果报错只显示500页面,记得先打开app_debug,等确认无误后再关掉。整个过程大概四十分钟,比我想象的快,但每个坑都卡在细节上——这框架本身不复杂,复杂的是你过去两年里在它身上叠加的各种手写补丁。