第一次尝试从nginx/php-fpm日志去分析问题,结果基本没什么有效信息,试了好多天也没有找到问题,页面白屏,只能看到是500错。
第二次尝试打开PHP的报错信息ini_set('display_errors','On');error_reporting(E_ALL); 结果只能看到Fatal error: Uncaught Error: Call to undefined function Think\C() in /www/ThinkPHP/Library/Think/Think.class.php:347 Stack trace: # 这个错误,百度了一番基本没有有效的答案。研究了半天发现是Think.class.php里面include Commons.php等文件失败,但是找不到失败的原因。因为这个错其实是因为include文件失败,导致C函数无法使用,并不是根源上引起无法访问的错误。
第三次尝试,突然发现Think.class.php里面有
// 设定错误和异常处理
register_shutdown_function('Think\Think::fatalError');
set_error_handler('Think\Think::appError');
set_exception_handler('Think\Think::appException');
这些代码,看上去是TP用自己的错误处理方法接管了PHP原生的,注释掉试试能不能得到更多错误。果然得到这样足够清楚的报错:
Warning: include(/www/ThinkPHP/Common/functions.php): failed to open stream: No such file or directory in //www/ThinkPHP/Library/Think/Think.class.php on line 56
Warning: include(): Failed opening '/www/ThinkPHP/Common/functions.php' for inclusion (include_path='.:/usr/share/php') in //www/ThinkPHP/Library/Think/Think.class.php on line 56
//www/ThinkPHP/Common/functions.php
Parse error: syntax error, unexpected 'public' (T_PUBLIC), expecting end of file in //www/ThinkPHP/Common/functions.php on line 1240
看起来是公共函数库里多了一个public关键字,应该是哪次加方法加错了。删掉public果然解决了这次的奇怪问题。
总结发现,原来因为修改TP核心库里面的公共函数库语法错,导致include该文件失败,进而导致C函数无法使用,坑就坑在这里,TP注册了异常处理方法,但是它异常处理方法里又要用到C函数,这样又掩盖了程序出错的信息,使其得不到展示。