部署教程

程序本地能跑、一上线就翻车:我们翻得最多的五类问题

不是框架选错那么简单。伪静态、回调、权限、时区、证书——这些不起眼的点,往往才是「演示好好的,客户环境就不行」的真相。

程序本地能跑、一上线就翻车:我们翻得最多的五类问题

做站长技术这块久了,有句话听得特别多:

「我这边演示好好的,怎么到服务器就不行了?」

这话通常不是抬杠。本地、演示站、客户生产环境,三套东西看起来都叫「网站」,其实差在一堆不起眼的细节上。下面按我们实际排障里出现频率最高的五类,说人话版——方便你自己先对照,也方便转给正在踩坑的同行。

一、根目录指错了,伪静态等于白配

很多 PHP 项目入口在 public/ 或 web/,宝塔却指到了仓库根目录。结果是:

· 能打开首页,内页 404;
· 路由全挂,API 全 404;
· 有人以为是「代码坏了」,其实是运行目录没指对。

建议上线清单第一项就写死:运行目录、伪静态规则、禁止访问的配置文件(如 .env、config.php)。这三项没核,后面的支付和登录排查都会被噪音带偏。

二、回调地址「能访问」不等于「能入账」

支付、微信登录最常见的翻车不是密钥填错,而是:

· 异步通知到了,但验签失败被静默丢掉;
· HTTP / HTTPS 混用,浏览器跳得了,服务器回调被拒;
· 测调用的是 A 域名,商户后台填的是 B 域名;
· 同一笔单重复通知,没有幂等,出现重复履约或状态乱跳。

我们排这类问题,一般不先改业务代码,而是先对三样东西:商户后台登记的 URL、服务器实际收到的请求、订单表里的状态流转。对得上,再谈密钥;对不上,改代码也是盲打。

三、权限与写入目录:能装上,不代表能用下去

安装向导走完,后台却无法上传、无法写缓存、无法生成二维码临时文件——多半是目录权限或 open_basedir 把路径卡死了。

表现很「玄学」:有的页面正常,点到上传/导出/打包就报错或空白。日志里常见是 failed to open stream 或 Permission denied。上线时把 uploads、runtime、cache 这类目录的可写性当成必检项,能少熬半夜。

四、时区、Cron、会话:定时任务和登录态的隐形坑

到期提醒、关站、清理、对账——靠计划任务的系统,最怕两件事:

· 服务器时区是 UTC,业务按北京时间写条件,到期判断整体偏八小时;
· Cron 配了,但用的是内网地址或错误的 key,任务其实从没成功跑过。

登录态也有类似问题:多子域、HTTP/HTTPS 切换、会话目录不可写,都会表现为「刚登录又掉线」。这类问题优先看环境,而不是先怀疑用户乱操作。

五、扩展与版本:演示机和新机不是同一个 PHP

客户环境仍可能是旧扩展组合:缺 curl、缺 zip、缺 intl,或者 PHP 小版本差异导致某个语法/函数行为不一致。演示机「刚好都装着」,新机「刚好缺一个」,页面就白了。

所以交付文档里与其写「支持 PHP 8」,不如写清:必须扩展列表、禁止的运行模式、推荐小版本。少一句模糊承诺,少一次扯皮。

写在最后

上面五类,没有一个是「高深算法」。它们烦,是因为散落在面板、域名、商户后台、系统和代码之间,谁都觉得「应该没问题」,直到客户正式用起来。

我们日常接代搭建、联调、排障,本质上就是把这些缝补齐:让程序在真实环境里可访问、可收款、可维护,而不是只停在本地演示。

如果你正在把一套能跑的程序往生产推,不妨先按这五条自查一遍;卡在哪一类,欢迎拿报错信息和面板截图过来对一下——很多时候,问题比想象中具体,也比想象中好解。