N’chifukwa chiyani Adminer.php ilibe kanthu? Koma kusintha dzina lake kumagwira ntchito bwino? Kusanthula chifukwa chake ndi njira yothetsera mavuto atatu.

昨天下午,我在给服务器配置Adminer数据库管理工具。Adminer这玩意,轻量、好用,一个PHP文件搞定,不用像phpMyAdmin那样装一堆依赖。我从官网下了最新版,传到服务器,设置好权限,打开浏览器,准备一睹芳容。

然后,一片空白。

N’chifukwa chiyani Adminer.php ilibe kanthu? Koma kusintha dzina lake kumagwira ntchito bwino? Kusanthula chifukwa chake ndi njira yothetsera mavuto atatu.

我刷新了三次,F5按得手指头都疼了。还是空白。浏览器开发者工具打开,200 OK,响应体是空的。我当时就愣住了,这是什么情况??

我寻思了一下,难道是文件权限问题?检查,755。难道是PHP版本不兼容?检查,PHP 8.2,没问题。难道是文件本身有问题?我重新下载了一份,覆盖上去,还是空白。

鬼使神差的,我想,要不改个名试试?

我把adminer.php重命名为adminer1.php,刷新。

正常访问了。

???我当时就真的有点懵了。同一份文件,同样的代码,同样的服务器,改个名就能访问了?这是什么玄学??

adminer.php空白问题现象

后来我才知道,这不是玄学,这是PHP缓存在搞鬼。

OPcache,全称Opcode Cache,PHP的性能优化扩展。它的原理很简单,PHP是解释型语言,每次请求都要把PHP代码编译成opcode再执行。OPcache把编译结果缓存到内存里,下次请求直接用缓存,不用重新编译,性能提升明显。

但问题就出在这里。

之前adminer.php的内容是「File not found」(我之前传错过文件),OPcache已经把那个错误内容的编译结果缓存了。后来我用正确的代码覆盖了adminer.php,但OPcache不管,它依然从内存里读取旧的缓存,所以页面呈现空白或者旧报错。

而当你改名成adminer1.php时,对OPcache来说,这是一个全新的文件路径,它会老老实实地重新加载并正常解析。

这感觉,就像你明明已经换了新书,但图书馆的索引卡上还写着旧书的索书号,你去架上找,当然是空的。但如果你换了个书名,图书馆就会给你建新的索引卡,然后就能找到了。

原因一:OPcache缓存导致空白

Kodi mungathane nawo bwanji?

重启PHP-FPM服务,清空OPcache缓存。

# 查看正在运行的PHP版本
php -v

# 重启对应的PHP-FPM(例如PHP 8.5)
sudo systemctl restart php8.5-fpm

# 或者重启所有PHP-FPM服务
sudo systemctl restart php*-fpm

重启完,把文件名改回adminer.php,刷新网页(建议按Ctrl+F5强制刷新浏览器),问题解决。

但故事还没完。

我当时重启完PHP-FPM,改回adminer.php,刷新,还是空白。我又懵了。

原因二:Nginx配置规则限制

这就引出了第二个可能的原因。

Nginx配置文件中,可能对adminer.php有特殊的规则限制。

我之前在HestiaCP面板里配置过Fail2Ban,写了一条针对adminer.php的精准匹配规则,为了防止暴力破解。规则里写死了adminer.php这个文件名,所以一旦你改名成adminer1.php,就绕过了这个Nginx规则,能正常访问。

排查办法很简单,搜一下Nginx配置里有没有硬编码:

sudo grep -rn "adminer.php" /etc/nginx/

如果搜到了类似location = /adminer.php { … }这样的规则,说明Nginx针对这个特定文件名做了特殊处理。删掉或者改掉就好了。

原因三:PHP错误显示设置

第三个原因,就比较隐蔽了。

PHP脚本被拦截或者报错,但页面关闭了错误显示(display_errors = Off)。在生产环境中,PHP默认会将错误隐藏,显示为空白页。如果你的入口文件(比如index.php)尝试include “./adminer.php”时因为某种原因崩溃了,页面就会直接变成纯白。

这种时候,查看错误日志是最靠谱的办法:

# 查看Nginx错误日志
sudo tail -n 20 /var/log/nginx/error.log

# 或者查看HestiaCP对应域名的error日志
sudo tail -n 20 /var/log/nginx/domains/adminer.domain.com.error.log

日志里会直接告诉你白屏的真正原因。

说实话,我最后就是靠查error.log发现问题的。原来是adminer.php里调用了一个不存在的PHP扩展,而display_errors是Off,所以页面就一片空白,但错误日志里记得清清楚楚。

解决方案与排查步骤

这事儿给我的感触还挺深的。

技术问题往往不是表面上看起来那么简单。adminer.php空白,表面看是文件问题,往下挖,可能是缓存问题,再往下挖,可能是配置问题,再往下挖,可能是代码本身的问题。

你不是程序员,可能觉得这些跟你没关系。但想想看,你用的每一个APP,你访问的每一个网页,背后都有一套类似的系统在运行。缓存、配置、错误处理,这些概念,其实无处不在。

就像我们人一样。很多时候我们表现出的”症状”,比如拖延、焦虑、烦躁,表面看是懒,往下挖,可能是目标不清晰,再往下挖,可能是对失败的恐惧,再往下挖,可能是童年经历塑造的思维模式。

找到真正的病根,才能对症下药。

最后,如果你也遇到了adminer.php空白的问题,按照这个顺序排查:

先重启PHP-FPM清缓存,然后检查Nginx配置,最后查error.log。

大多数情况下,前两步就能解决。

当然,如果还是不行,那就查error.log吧。

它会告诉你答案的。

Popeza mwawerenga mpaka pano, ngati mwapeza kuti n’zothandiza, chonde kondani ndikugawana. Ngati mukufuna kulandira zosintha kaye, mutha kunditsatira!

Zikomo powerenga nkhani yanga. Tionananso nthawi ina.

发表 评论

Imelo yanu sisindikizidwa. Minda yofunikira imagwiritsidwa ntchito * Chizindikiro

Kalozera wa Nkhani
Pitani pamwamba