做站长技术这块久了,有句话听得特别多:
「我这边演示好好的,怎么到服务器就不行了?」
这话通常不是抬杠。本地、演示站、客户生产环境,三套东西看起来都叫「网站」,其实差在一堆不起眼的细节上。下面按我们实际排障里出现频率最高的五类,说人话版——方便你自己先对照,也方便转给正在踩坑的同行。
一、根目录指错了,伪静态等于白配
很多 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」,不如写清:必须扩展列表、禁止的运行模式、推荐小版本。少一句模糊承诺,少一次扯皮。
写在最后
上面五类,没有一个是「高深算法」。它们烦,是因为散落在面板、域名、商户后台、系统和代码之间,谁都觉得「应该没问题」,直到客户正式用起来。
我们日常接代搭建、联调、排障,本质上就是把这些缝补齐:让程序在真实环境里可访问、可收款、可维护,而不是只停在本地演示。
如果你正在把一套能跑的程序往生产推,不妨先按这五条自查一遍;卡在哪一类,欢迎拿报错信息和面板截图过来对一下——很多时候,问题比想象中具体,也比想象中好解。