因为软件插件有自动转换函数名的功能,调试错误让我崩溃半天
事情起因:去朋友家玩,手机收到了网站打不开的错误短信提醒,以为是被攻击了,看了信息才发现是因为此前自己修改的页面还没提交导致页面错误未修正造成的错误,于是直接在朋友家就用他的电脑克隆一下项目到本地,他用的是xscode软件,我用他的xscode软件开始修改有问题的页面,修改好后将页面push后,网站不报错了但也不显示了,打开网站就是一个空白页面,任何页面都是空白,F12调出浏览器开发者工具,连HTTP任何输出都没有,测试访问网站根目录不涉及本项目的静态页面或动态页面都能正常显示,但只要访问本项目的任何页面全是一片空白,无任何信息输出,一下给自己的搞慌了,不得不根据平时的开发习惯修复尝试。
1、切换项目为开发者模式,结果依然不显示不报错,无任何输出的空白页面
2、不使用项目本身的调试模式,直接在项目入口文件中写入原生PHP调试代码
ini_set('display_errors', 'On');
error_reporting(E_ALL);
依然一片空白,不输出任何信息也不报错,看来调试这条路走不通了。
3、可能是保存文件时用了UTF-8 With BOM方式导致有输出bom头,网上保存了一个代码如下清除bom头的文件。
<?php
$basedir = ".";
function checkBOM($filename) {
$contents = file_get_contents($filename);
if (substr($contents, 0, 3) == "\xEF\xBB\xBF") {
return true;
}
return false;
}
$dh = opendir($basedir);
while (($file = readdir($dh)) !== false) {
if ($file != '.' && $file != '..' && !is_dir($basedir."/".$file)) {
if (checkBOM("$basedir/$file")) {
echo "BOM found in: $file <br>";
}
}
}
closedir($dh);
?>
不过如果是BOM头影响的话,应该开启开发模式直接会在页面上输出如下错误:
Warning: Cannot modify header information - headers already sent by (output started at ...)
虽然有60%的把握认为不可能是BOM头原因导致的,但死马当活马医,总得都尝试一下才清楚问题所在了,结果也如我所料,将所有文件扫描一遍后,确定所有文件都不存在bom头。
4、觉得可能是服务器开启Opcache缓存未失效导致的延迟报错,直接打开Opcache重置页面,居然报了Opcache not detected?的错误,是我想多了,Opcache都未被侦测到,何谈重置啊!
5、尝试这么久,居然忘记看项目运行日志了,从日志内容排查最快的,但打开日志却只是寥寥几行:
[ 2026-09-12 22:35:18+08:00 ] 192.168.1.110 /
INFO: [ app_init ] --START--
INFO: Run Tool\CheckEnv [ RunTime:0.000022s ]
INFO: [ app_init ] --END-- [ RunTime:0.000438s ]
完全没有任何有帮助的信息,项目运行即结束,项目运行完全就没有运行到核心部分,只到了项目运行检测环境就结束了。
6、完全没办法了,只得使用最原始的调试方式,使用php -l file的形式看今天修改的所有文件有没有错误。
不试不知道,试了才发现问题所在,自己的一个函数文件直接报了重复声明的如下错误:
> php -l function.php
Fatal error: Cannot redeclare combineArray() (previously declared in function.php:131) in function.php on line 180
Errors parsing function.php
翻看了Git的提交记录,发现以前版本中的function.php文件中有两个函数分别是combile_array和combileArray,而到今天修改后,两个函数都变成了combileArray,难怪会报重复声明的致使错误。
我问了朋友是不是软件上安装能将下划线式函数命名法直接转成驼峰式函数命名法的插件,朋友说是的,因为他习惯用驼峰式命名法命名函数,所以装了这款插件可以帮助他自动把有下划线的函数自动转成驼峰式命名法的函数。
于是把多余函数给去除掉,只留下一个在用的驼峰式命名的函数,这才把项目输入空白页面的问题解决掉。
PS:责任还是在自己,因为是旧项目,所以保留了很多以前用下划线命名函数,现在我也主要使用驼峰式的函数命名法,我并没有统一修改,而是两种方式混用在一起,看来得抽时间重构一下,要不然有可能还会犯同样的错,就算不想改,若项目有混合命名法的话,还是把插件中自动转换函数名的功能给禁掉,否则以后还会花更多的时间在这些不必要的问题上。



目前共有 1 条回复