一个空格引发的bug
好久没写博客了。
我们的一个项目用的thinkphp框架,当在debug模式下面运行很正常,但切换到生产模式时,刷新页面第一次可以正常显示,刷新第二次会出现错误如下:
Fatal error: Call to undefined function Think\C() in /home/work/huangxuan/anti/Protected/ThinkPHP/Library/Think/Think.class.php on line 301
我们很自然的找到了出错所在的位置:
static public function halt($error) {
...
$error_page = C('ERROR_PAGE');
...
}
说明C函数没有定义,但这个函数是框架函数,怎么会没有定义 ?
继续看这个halt函数,发现它是框架的错误处理函数,也就是PHP遇到所有的问题后,最终会执行这个函数。
于是我们就在此函数的第一句话中打印var_dump($error);如下:
| array(4) { | |
| ["type"]=> | |
| int(4) | |
| ["message"]=> | |
| string(48) "syntax error, unexpected 'function' (T_FUNCTION)" | |
| ["file"]=> | |
| string(74) "/home/work/huangxuan/anti/Protected/Application/Runtime/common~runtime.php" | |
| ["line"]=> | |
| int(1) | |
| } |
继续找文件/home/work/huangxuan/anti/Protected/Application/Runtime/common~runtime.php,我们知道这个文件是thinkphp把框架核心程序文件去掉空格和注释后,揉到了一起,目的是提高效率。
但这个文件只有一行,我们也没法定位原因。
这也难不到我们,我们把这个文件一行分成多行,怎么分呢,批量替换,在每一个分号后面都加上换行符,再次刷新页面,我们就可以看到出错的行了:
| array(4) { | |
| ["type"]=> | |
| int(4) | |
| ["message"]=> | |
| string(48) "syntax error, unexpected 'function' (T_FUNCTION)" | |
| ["file"]=> | |
| string(74) "/home/work/huangxuan/anti/Protected/Application/Runtime/common~runtime.php" | |
| ["line"]=> | |
| int(888) | |
| } |
在第888行,我们发现
namespace {p function C($name=null, $value=null,$default=null) ...
类似这样的代码,大括号后面的那个p就是错误原因所在,但为什么程序中会多了一个字母p呢,我们继续找这段程序的原始位置,
/home/work/huangxuan/anti/Protected/ThinkPHP/Common/functions.php除去注释后的第一行:
function C($name=null, $value=null,$default=null) {....
为什么这个函数前面会有个p呢,我们几个人瞅了半天也没瞅出来,后来眼尖的同时发现php脚本第一行的标记(这里有个空格)<?php前面有个空格,去掉空格后果然好了。
但为什么一个空格会造成出现一个多余的字母p呢?
终于我总结出来,thinkphp在把程序揉到一起时,要把每个文件最前面的<?php标记去掉,它肯定是脑残的把前5个字符去掉,前面多了一个空格,自然就会多出来一个字母p....
大功告成!
但还没完,我得找到实实在在的证据,经过对框架的阅读,终于找到位置:
home/work/huangxuan/anti/Protected/ThinkPHP/Mode/Api/functions.php的compile函数的第二行:
$content = trim(substr($content, 5));
果真就是这么脑残的处理....
后记:这个错误我们两个人处理了半下午,各种找日志啥的,最终还是找到原因,其实过程不像博客中说的那么顺利
一个空格引发的bug的更多相关文章
- Gson-记录一个空格引发的json血案
使用的Gson将json自动装载到Bean,一般情况下,用起来又快又稳. 直到有一天,测试告诉我说,填写地址时,地址里有空格,就会500异常. 我把异常截取出来: Type Exception Rep ...
- 一个排序引发的BUG
你好呀,我是why. 前两天在 Git 上闲逛的时候又不知不觉逛到 Dubbo 那里去了. 看了一下最近一个月的数据,社区活跃度还是很高的: 然后看了一下最新的 issue,大家提问都很积极. 其中看 ...
- 一个request引发的bug
有很多错误由于需要是多线程是才会发生,导致经常在开发时很难发现, import java.lang.reflect.ParameterizedType; import java.util.List; ...
- 一个 passive 引发的bug
不是什么很难的东西,权且做个记录. 首先说下背景,目前的项目中,需要同时绑定 wheel 和 scroll 事件. 绑定 wheel,目的是开发 ctrl + wheel 缩放页面功能,此功能与浏览器 ...
- 一个字体引发的bug
delphi 7 中默认字体样式为‘MS Sans Serif’,一般情况下子级控件会继承父级一些属性,其中包括字体(包括字体大小,字体样式,颜色等)属性.如果动态创建控件且需要修改字体颜色或者大小时 ...
- Spring 循环引用(一)一个循环依赖引发的 BUG
Spring 循环引用(一)一个循环依赖引发的 BUG Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) Spring 循环 ...
- 由一个emoji引发的思考
由一个emoji引发的思考 从毕业以来,基本就一直在做移动端,但是一直就关于移动端的开发,各种适配问题的解决,在日常搬砖中处理了就过了,也没有把东西都沉淀下来,觉得甚是寒颜.现就一个小bug,让我们来 ...
- 一个空格也可以让html格式显示大不相同
今天在编写html时出现了bug,有两个标签一直贴近显示,但是两段代码完全一样前一段就没有问题. 错误代码如下 <div id="tool1" style="wid ...
- 安卓微信overflow-x overflow-y引发的bug
今天xgo文章图片页上线用微信扫页面发现一个bug,页面可以双击放大缩小. 找了半天原因,发现是图片描述设置了overflow-y引发的bug. 建议在微信场景里满屏显示不能滚动的页面里慎用overf ...
随机推荐
- 破解https和https原理
http://blog.csdn.net/cch5487614/article/details/6364711 http://www.jb51.net/network/68135.html
- yii2 AR需要注意的地方
$model::find(['id'=>1])->one();和$model::findOne(1); 返回的都是一个Obj不能使用foreach遍历,其他都是返回对象数组可以用forea ...
- 检查ftp备份数据完整性及短信告警的shell脚本
发布:thebaby 来源:net [大 中 小] 检查ftp备份数据完整性及短信告警的shell,有需要的朋友可以参考下. 该脚本实现如下的功能: 对远程备份到ftp服务器的数据完整性及 ...
- http 常用状态码及含义
http://www.kuaipan.cn/developers/document_status.htm
- 上传文件格式控制的困惑(application/octet-stream 限制不了BAT等格式上传)问题解决
允许上传类型部分代码 $uptypes=array( //上传文件类型列表 'image/gif', 'image/jpg', 'image/jpeg', 'image/pjpeg', 'image ...
- Python 学习之urllib模块---用于发送网络请求,获取数据(4)
承接将查询城市编码的结果保存到文件中,以字典的形式保存,目的是为了在查询某个城市的天气的时候,能够通过输入的城市名称,找到对应的城市编码.所以此结果字典的数据结构,就是city={城市名称:城市编码} ...
- 第一个CUDA程序
开始学CUDA 先写一个简单的 #include<iostream>__global__ void add( int a, int b, int *c ) { *c = a + b;}in ...
- Memcached(三)Memcached配置参数初解
一.基本参数在我们第一次安装Memcached时,一般都是用过这个命令: memcached -m 512 -u root -d -l 127.0.0.1 -p 11211 我们先来解释这几个参数的含 ...
- the request doesn't contain a multipart/form-data or multipart/form-data stream, content type header
the request doesn't contain a multipart/form-data or multipart/form-data stream, content type header ...
- PEP Index > PEP 339 -- Design of the CPython Compiler 译文
http://www.python.org/dev/peps/pep-0339/ PEP: 339 标题: CPython的编译器设计 版本: 425fc5598ee8 最后修改: 2011-01-1 ...