知识大全 请离开include

Posted 文件

篇首语:黑暗带来恐惧。知识可以点亮你,驱逐恐惧。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 请离开include相关的知识,希望对你有一定的参考价值。

尽量使用include 而不是include_once 理由是 include_once需要查询一遍已加载的文件列表 确认是否存在 然后再加载  

  诚然 这个理由是对的 不过 我今天要说的 是另外一个的原因 我们知道 PHP去判断一个文件是否被加载 是需要得到这个文件的opened_path的 意思是说 比如:

复制代码 代码如下:     <?php     set_include_path("/tmp/:/tmp /");     include_once(" php");     ?>

   当 PHP看到include_once “ php”的时候 他并不知道这个文件的实际路径是什么 也就无法从已加载的文件列表去判断是否已经加载 所以在include_once的实现中 会首先尝试解析这个文件的真实路径(对于普通文件这个解析仅仅类似是检查getcwd和文件路径 所以如果是相对路径 一般是不会成功) 如果解析成功 则查找EG(include_files) 如果存在则说明包含过了 返回 否则open这个文件 从而得到这个文件的opened_path 比如上面的例子 这个文件存在于 “/tmp / php” 然后 得到了这个opened_path以后 PHP去已加载的文件列表去查找 是否已经包含 如果没有包含 那么就直接pile 不再需要open file了

   尝试解析文件的绝对路径 如果能解析成功 则检查EG(included_files) 存在则返回 不存在继续 打开文件 得到文件的打开路径(opened path) 拿opened path去EG(included_files)查找 是否存在 如果存在则返回 不存在继续 编译文件(pile_file)

  这个在大多数情况下 不是问题 然而问题出在当你使用APC的时候… 在使用APC的时候 APC劫持了pile_file这个编译文件的指针 从而直接从cache中得到编译结果 避免了对实际文件的open 避免了对open的system call 然 而 当你在代码中使用include_once的时候 在pile_file之前 PHP已经尝试去open file了 然后才进入被APC劫持的pile file中 这样一来 就会产生一次额外的open操作 而APC正是为了解决这个问题 引入了include_once_override 在include_once_override开启的情况下 APC会劫持PHP的ZEND_INCLUDE_OR_EVAL opcode handler 通过stat来确定文件的绝对路径 然后如果发现没有被加载 就改写opcode为include 做一个tricky解决方案 但是 很可惜 如我所说 APC的include_once_override实现的一直不好 会有一些未定义的问题 比如:

复制代码 代码如下:     <?php     set_include_path("/tmp");     function a($arg = array())         include_once("b php");         a();     a();     ?>

   然后 我们的b php放置在”/tmp/b php” 内容如下:

复制代码 代码如下:     <?php       class B     ?>

   那么在打开apc include_once_override的情况下 连续访问就会得到如下错误: Fatal error include() : Cannot redeclare class

  排除这些技术因素 我也一直认为 我们应该使用include 而不是include_once 因为我们完全能做到自己规划 一个文件只被加载一次 还可以借助自动加载 来做到这一点

cha138/Article/program/PHP/201311/20878

相关参考

知识大全 听到一首歌 部分歌词是 不爱我请离开我 请问是什么歌

听到一首歌部分歌词是不爱我请离开我请问是什么歌?歌曲:倒数歌手:萧亚轩专辑:钻石糖萧亚轩-倒数作词:葛大为作曲:kim,seokjin专辑:钻石糖怎黱我会说太晚了你不用送其实我想说可不可以不要走车里的

知识大全 JSP中include指令和include动作区别详解

JSP中include指令和include动作区别详解  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧

知识大全 关于include标签导致js路径找不到的问题分析及解决

  关于使用jsp:include标签及<%@include标签时要注意的事项先回忆一下二者的区别(对于此篇文章而言二者在用法上没有区别)jsp:include是先编译一下includedjsp

不要拿贵重物品占座,需要短暂离开时请将贵重物品带走,出去接打电话时,贵重物品不要离开视线。离开时,应清点个人物品,以免遗忘导致丢失。()

不要拿贵重物品占座,需要短暂离开时请将贵重物品带走,出去接打电话时,贵重物品不要离开视线。离开时,应清点个人物品,以免遗忘导致丢失。()A、正确B、错误正确答案:A

不要拿贵重物品占座,需要短暂离开时请将贵重物品带走,出去接打电话时,贵重物品不要离开视线。离开时,应清点个人物品,以免遗忘导致丢失。()

不要拿贵重物品占座,需要短暂离开时请将贵重物品带走,出去接打电话时,贵重物品不要离开视线。离开时,应清点个人物品,以免遗忘导致丢失。()A、正确B、错误正确答案:A

知识大全 实测在class的function中include的文件中非php的global全局环境

正如标题所言经测试的结果为在class中include后被include文件变量域已经变成func中了非全局但是可以通过global提升感兴趣的朋友可以参考下哈希望对大家有所帮助   测试代

知识大全 JSP指令元素(page指令/include指令/taglib指令)复习整理

JSP指令元素(page指令/include指令/taglib指令)复习整理  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让

知识大全 asp.net 里include UTF8 垃圾问题

asp.net里includeUTF8垃圾问题  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  很

知识大全 请朋友帮帮我

请朋友帮帮我!楼主你好,你和我一样,我也是这样了不过我现在不得不定心地工作了我是个男孩子,今年21岁了,前段时间离开了工作两年多的公司也许是在那个公司太舒服的原因吧我出来后一直找不到合适的工作也许我已

知识大全 你成绩好 请走人

深圳某生产半导体的著名外企在西安某高校招聘时,对来到招聘现场的同学说的第一句话是:「在座的同学,如果你的成绩排名在班级属于前10%或者后10%,那么请离开这里,我们不想浪费你的时间,我们公司不需要这样