把ThinkPHP项目往服务器上一扔就能跑?网站我见过太多人栽在这上面。去年帮朋友处理一个商城项目,服务本地用phpstudy跑得好好的器托,上传到阿里云ECS后首页直接白屏,网站日志里一行“file_put_contents(): failed to open stream: Permission denied”让他折腾了整晚。服务问题不在代码,器托在于托管环境没配对。网站
ThinkPHP对运行环境有硬性要求,服务版本不同还差得挺远。器托TP5.1最低要PHP 5.6,网站但实际生产建议7.1以上;TP6直接卡死PHP 7.2.5起步,服务还得开PDO、器托MBstring、网站OpenSSL这些扩展。服务我习惯用宝塔面板装环境,器托省事。不过宝塔默认装的PHP有时候缺fileinfo扩展,TP6的验证码、文件上传功能就会报错,得手动在软件商店里勾上。
目录权限是第一个坑。ThinkPHP的runtime目录必须可写,Linux下通常设755,所有者给www。有人图省事直接chmod -R 777,能跑,但服务器安全就没了。我一般这么干:
chown -R www:www /www/wwwroot/项目目录,然后chmod -R 755,再单独给runtime和public/uploads开写权限。Windows服务器更简单,右键属性给IIS_IUSRS写权限就行,但Windows跑PHP性能确实不如Linux,小项目无所谓,日PV过万的还是换Linux吧。Nginx配置是第二个坑。ThinkPHP入口文件在public目录下,很多人直接把网站根目录设成项目根目录,结果index.php暴露在外,URL里还带着public,难看又不安全。正确做法是把站点根目录指向public文件夹。Nginx伪静态规则也得加,TP6的规则和TP5略有不同。我贴个常用的:
location / { if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s=$1 last; } }Apache环境下.htaccess文件别忘了,ThinkPHP自带的那份在public目录里,但有时候服务器没开AllowOverride,伪静态直接失效,所有路由都404。宝塔用户直接在网站设置里选ThinkPHP伪静态模板就行,省得手写。
数据库连接错误也常见。本地用root空密码,服务器上数据库密码复杂了,config/database.php里没改,一访问就报“SQLSTATE[HY000] [1045] Access denied”。还有人把数据库地址写成localhost,但服务器上MySQL和PHP不在同一台机器,得改成内网IP。另外TP6默认开启数据库调试模式,生产环境记得在.env文件里把APP_DEBUG设为false,不然错误信息全暴露给用户,安全隐患不小。
缓存和日志目录建议单独挂载。我有个客户项目日志量特别大,runtime目录几个月就撑到几十G,磁盘满了导致网站挂掉。后来把runtime挂到数据盘,定期清理才稳住。ThinkPHP的日志按天分文件,配置里可以设max_files限制保留天数,TP6在config/log.php里改。
HTTPS现在基本是标配。Let's Encrypt免费证书申请方便,宝塔一键搞定。但注意TP6的URL生成默认走http,需要在config/app.php里设
'url_https' => true,或者中间件里强制跳转。不然混合内容警告会让浏览器拦截资源加载。最后说个真实案例。上个月一个TP5.1项目迁移到新服务器,所有页面打开都慢三秒。查了半天,发现是session存储路径没配,默认走文件存储,而新服务器/tmp目录挂的是机械盘。改成Redis存session后,响应时间直接降到200ms。托管ThinkPHP项目,环境配置的细节比代码本身更容易出问题,多花半小时检查配置,能省掉后面几天的排查时间。
顶: 3883踩: 8






评论专区