先说结论:PHP 源码跑不起来,九成不是源码有问题,是环境和配置不对。我这两个月帮人看了七八份跑不起来的源码,翻来覆去就那么几个原因。
今天按出现频率从高到低排一下,顺便把我自己的排查顺序放最后。
坑一:PHP 版本对不上
这是排第一的。老源码大多是 PHP 5.6 / 7.0 时代写的,你给它挂个 PHP 8.2,一堆函数直接报 deprecated 甚至 fatal error。
判断方法很简单,看源码根目录有没有 .user.ini、composer.json 或者安装说明里的版本要求。没有的话,默认按 PHP 7.4 试,跑通再往上加。
# 宝塔里切换版本的路径
网站 → 站点设置 → PHP版本 → 选 7.4 → 保存
坑二:伪静态没配
白屏、404、后台点不动,很多是这个。这套网站用的是 index.php?s=/xxx 这种路径,服务器不认识干净的 URL,当然全 404。
宝塔里直接选对应的伪静态规则,比如 ThinkPHP、Laravel、WordPress 都内置了。选不到就自己粘一条 nginx 规则:
location / {
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=$1 last;
}
}
坑三:数据库没导全,或者表前缀不对
症状是首页打得开,点任何页面都报「数据表不存在」。
两个常见原因:一是 sql 文件太大,phpMyAdmin 超时只导了一半;二是配置里的表前缀和数据库里的前缀不一致(比如配置写 gq_,库里是 wp_)。
导入大 sql 建议直接命令行,比网页稳:
mysql -u用户名 -p 数据库名 < /www/backup/db.sql
坑四:目录权限不对
界面正常但上传图片失败、安装时写不进配置文件,基本都是权限问题。目录 755、文件 644、运行用户跟 PHP-FPM 一致,这三条对上了就没问题。
chown -R www:www /www/wwwroot/你的站点
find /www/wwwroot/你的站点 -type d -exec chmod 755 {} \;
find /www/wwwroot/你的站点 -type f -exec chmod 644 {} \;
坑五:扩展没装
GD、fileinfo、curl、zip、openssl 这几个是老源码的高频依赖。少了 fileinfo 往往连安装向导都进不去,报错还特别含糊。
宝塔里点一下装上就行,记得装完重启 PHP,不重启不生效。
我的排查顺序
- 开 PHP 错误显示,先看到真实报错,别猜
- 看日志:
站点错误日志+PHP 日志,两个都要看 - 核对 PHP 版本和扩展
- 核对伪静态
- 核对数据库连接和表前缀
- 最后才怀疑权限
把错误打开这一步特别重要,很多人上来就瞎改代码,其实报错信息早就写在那儿了。
最后
我现在的习惯是:任何一份新源码,先在一个干净的子目录里跑通,再往正式站点上搬。跑不通就换版本重来,反正成本很低。最怕的是一上来就往正式站上覆盖,出了问题连原来的状态都回不去。