好久没写博客了。

我们的一个项目用的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的更多相关文章

  1. Gson-记录一个空格引发的json血案

    使用的Gson将json自动装载到Bean,一般情况下,用起来又快又稳. 直到有一天,测试告诉我说,填写地址时,地址里有空格,就会500异常. 我把异常截取出来: Type Exception Rep ...

  2. 一个排序引发的BUG

    你好呀,我是why. 前两天在 Git 上闲逛的时候又不知不觉逛到 Dubbo 那里去了. 看了一下最近一个月的数据,社区活跃度还是很高的: 然后看了一下最新的 issue,大家提问都很积极. 其中看 ...

  3. 一个request引发的bug

    有很多错误由于需要是多线程是才会发生,导致经常在开发时很难发现, import java.lang.reflect.ParameterizedType; import java.util.List; ...

  4. 一个 passive 引发的bug

    不是什么很难的东西,权且做个记录. 首先说下背景,目前的项目中,需要同时绑定 wheel 和 scroll 事件. 绑定 wheel,目的是开发 ctrl + wheel 缩放页面功能,此功能与浏览器 ...

  5. 一个字体引发的bug

    delphi 7 中默认字体样式为‘MS Sans Serif’,一般情况下子级控件会继承父级一些属性,其中包括字体(包括字体大小,字体样式,颜色等)属性.如果动态创建控件且需要修改字体颜色或者大小时 ...

  6. Spring 循环引用(一)一个循环依赖引发的 BUG

    Spring 循环引用(一)一个循环依赖引发的 BUG Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) Spring 循环 ...

  7. 由一个emoji引发的思考

    由一个emoji引发的思考 从毕业以来,基本就一直在做移动端,但是一直就关于移动端的开发,各种适配问题的解决,在日常搬砖中处理了就过了,也没有把东西都沉淀下来,觉得甚是寒颜.现就一个小bug,让我们来 ...

  8. 一个空格也可以让html格式显示大不相同

    今天在编写html时出现了bug,有两个标签一直贴近显示,但是两段代码完全一样前一段就没有问题. 错误代码如下 <div id="tool1" style="wid ...

  9. 安卓微信overflow-x overflow-y引发的bug

    今天xgo文章图片页上线用微信扫页面发现一个bug,页面可以双击放大缩小. 找了半天原因,发现是图片描述设置了overflow-y引发的bug. 建议在微信场景里满屏显示不能滚动的页面里慎用overf ...

随机推荐

  1. js在php 中出现 unterminated string literal 解决方法

    出现这个问题就是空格造成的(可清空格符,换行符等) 示例代码如下: php 下报错 <?php echo "<a href=javascript:if(window.confir ...

  2. 前端工程的构建工具对比 Gulp vs Grunt

    1. Grunt -> Gulp 早些年提到构建工具,难免会让人联想到历史比较悠久的Make,Ant,以及后来为了更方便的构建结构类似的Java项目而出现的Maven.Node催生了一批自动化工 ...

  3. 对 HTTP 304 的理解(转)

    最近和同事一起看Web的Cache问题,又进一步理解了 HTTP 中的 304 又有了一些了解. 304 的标准解释是:Not Modified 客户端有缓冲的文档并发出了一个条件性的请求(一般是提供 ...

  4. c#开发Mongo笔记第一篇

    现在开发的这个项目要用mongo数据库开发,发现网上的这方面教程还是比较少的,只能边看官方说明边进行开发,再开发过程中写下笔记,也算上是一个总结吧. 我开发使用的是vs2013了,驱动用的是最新的1. ...

  5. 集合 ArrayList 向下转型 遍历

    List  list=new ArrayList(); Person p1=new Person("lisi1",21); Person p2=new Person("l ...

  6. hdu 3072

    强连通分量——tarjin 算法 这道题和前面那道hdu 2767唯一不同就是,2767需要找出最小数量的边使图成为连通分量,而这个题需要一点点贪心的思想在里面,它需要求出代价最小的边使图成为连通分量 ...

  7. 【BZOJ 2333 】[SCOI2011]棘手的操作(离线+线段树)

    2333: [SCOI2011]棘手的操作 Description 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来有如下一些操作: U x y: 加一条边 ...

  8. 【POJ1743】 Musical Theme (二分+后缀数组)

    Musical Theme Description A musical melody is represented as a sequence of N (1<=N<=20000)note ...

  9. 【Xamarin开发 Android 系列 7】 Android 结构基础(下)

    原文:[Xamarin开发 Android 系列 7] Android 结构基础(下) *******前期我们不打算进行太深入的东西,省的吓跑刚进门的,感觉门槛高,so,我们一开始就是跑马灯一样,向前 ...

  10. AD域环境的搭建 基于Server 2008 R2

    AD(Active Directory)即活动目录,微软的基础件.微软的很多产品如:Exchange Server,Lync Server,SharePoint Server,Forefront Se ...