源码网,源码论坛,源码之家,商业源码,游戏源码下载,discuz插件,棋牌源码下载,精品源码论坛

 找回密码
 立即注册
查看: 881|回复: 97

[PHP编程] 强烈声明: 不要使用(include/require)_once

[复制链接]

7万

主题

861

回帖

32万

积分

论坛元老

Rank: 8Rank: 8

积分
329525
发表于 2013-6-6 17:19:46 | 显示全部楼层 |阅读模式
本篇文章是对不要使用(include/require)_once的原因进行了详细的分析介绍,需要的朋友参考下

关于使用include还是include_once(以下,都包含require_once), 这个讨论很长了, 结论也一直有, 就是尽量使用include, 而不是include_once, 以前最多的理由的是, include_once需要查询一遍已加载的文件列表, 确认是否存在, 然后再加载.

诚然, 这个理由是对的, 不过, 我今天要说的, 是另外一个的原因.

我们知道, PHP去判断一个文件是否被加载, 是需要得到这个文件的opened_path的, 意思是说, 比如:
复制代码 代码如下:
<?php
set_include_path("/tmp/:/tmp2/");
include_once("2.php");
?>

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

然后, 得到了这个opened_path以后, PHP去已加载的文件列表去查找, 是否已经包含, 如果没有包含, 那么就直接compile, 不再需要open file了.

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

这个在大多数情况下, 不是问题, 然而问题出在当你使用APC的时候…

在使用APC的时候, APC劫持了compile_file这个编译文件的指针, 从而直接从cache中得到编译结果, 避免了对实际文件的open, 避免了对open的system call.

然而, 当你在代码中使用include_once的时候, 在compile_file之前, PHP已经尝试去open file了, 然后才进入被APC劫持的compile 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 b

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

你使用include_once, 只能证明, 你对自己的代码没信心.

所以, 建议大家, 不要再使用include_once

回复

使用道具 举报

2

主题

2万

回帖

473

积分

中级会员

Rank: 3Rank: 3

积分
473
发表于 2022-10-1 21:54:50 | 显示全部楼层
8888888888888888
回复 支持 反对

使用道具 举报

匿名  发表于 2022-10-1 23:42:20

casino real money

online casino
<a href="https://flashroyal.net/">gambling</a>
online casinos
<a href="https://casinowingames.com/">casinos online</a>
casino game
<a href="https://onlinelistcasino24.com/">slots</a>
casino games
<a href="https://realmonetcasino.com/">casino online</a>
casino games
<a href="https://casinogambiba.com/">casino game</a>
online casinos
<a href="https://casinowellplay.com/">online casino</a>
casino online
<a href="https://casinoongames.com/">gambling</a>
casino game
<a href="https://casinotoplines.com/">casino</a>
回复 支持 反对

使用道具

匿名  发表于 2022-10-1 23:42:53

casino game

casino online
<a href="https://flashroyal.net/">gambling</a>
casinos online
<a href="https://casinowingames.com/">slots</a>
gambling
<a href="https://onlinelistcasino24.com/">online casino</a>
casino games
<a href="https://realmonetcasino.com/">online casino</a>
casino games
<a href="https://casinogambiba.com/">casino</a>
casino online
<a href="https://casinowellplay.com/">casino games</a>
slots
<a href="https://casinoongames.com/">slots</a>
casinos
<a href="https://casinotoplines.com/">casino real money</a>
回复 支持 反对

使用道具

匿名  发表于 2022-10-1 23:43:35

casinos online

УОН 37.139.53.x ·±нУЪ 2022-10-1 23:42
online casino
gambling
online casinos

casino
<a href="https://flashroyal.net/">casino game</a>
online casino
<a href="https://casinowingames.com/">casino real money</a>
online casinos
<a href="https://onlinelistcasino24.com/">casino game</a>
online casino
<a href="https://realmonetcasino.com/">gambling</a>
casino real money
<a href="https://casinogambiba.com/">casino game</a>
casinos online
<a href="https://casinowellplay.com/">gambling</a>
casino game
<a href="https://casinoongames.com/">online casino</a>
casinos
<a href="https://casinotoplines.com/">casino</a>
回复 支持 反对

使用道具

匿名  发表于 2022-10-1 23:44:14

casino games

casino
<a href="https://flashroyal.net/">casinos</a>
casinos
<a href="https://casinowingames.com/">casino game</a>
casino games
<a href="https://onlinelistcasino24.com/">casino games</a>
casinos
<a href="https://realmonetcasino.com/">casinos</a>
online casino
<a href="https://casinogambiba.com/">slots</a>
casino real money
<a href="https://casinowellplay.com/">casinos</a>
online casinos
<a href="https://casinoongames.com/">slots</a>
casino online
<a href="https://casinotoplines.com/">casino game</a>
回复 支持 反对

使用道具

匿名  发表于 2022-10-1 23:44:43

casino game

УОН 37.139.53.x ·±нУЪ 2022-10-1 23:42
casino online
gambling
casinos online

casinos online
<a href="https://flashroyal.net/">casinos</a>
casino
<a href="https://casinowingames.com/">casino games</a>
casino game
<a href="https://onlinelistcasino24.com/">slots</a>
slots
<a href="https://realmonetcasino.com/">casinos</a>
casino online
<a href="https://casinogambiba.com/">casino online</a>
slots
<a href="https://casinowellplay.com/">casinos</a>
casinos online
<a href="https://casinoongames.com/">casinos</a>
casino real money
<a href="https://casinotoplines.com/">casinos</a>
回复 支持 反对

使用道具

匿名  发表于 2022-10-1 23:45:17

casino online

УОН 37.139.53.x ·±нУЪ 2022-10-1 23:42
online casino
gambling
online casinos

casinos online
<a href="https://flashroyal.net/">casino</a>
online casino
<a href="https://casinowingames.com/">casinos online</a>
casinos
<a href="https://onlinelistcasino24.com/">casinos online</a>
online casino
<a href="https://realmonetcasino.com/">online casinos</a>
casino
<a href="https://casinogambiba.com/">casino games</a>
gambling
<a href="https://casinowellplay.com/">gambling</a>
casinos
<a href="https://casinoongames.com/">casino real money</a>
casinos
<a href="https://casinotoplines.com/">casino</a>
回复 支持 反对

使用道具

匿名  发表于 2022-10-1 23:45:49

casino online


casinos online
<a href="https://flashroyal.net/">slots</a>
casino games
<a href="https://casinowingames.com/">online casinos</a>
casino game
<a href="https://onlinelistcasino24.com/">online casino</a>
casino games
<a href="https://realmonetcasino.com/">casinos</a>
casino
<a href="https://casinogambiba.com/">casino games</a>
casino games
<a href="https://casinowellplay.com/">online casinos</a>
casino online
<a href="https://casinoongames.com/">gambling</a>
online casino
<a href="https://casinotoplines.com/">casino games</a>
回复 支持 反对

使用道具

匿名  发表于 2022-10-1 23:46:21

casino game

casinos online
<a href="https://flashroyal.net/">casino game</a>
casino real money
<a href="https://casinowingames.com/">gambling</a>
casinos online
<a href="https://onlinelistcasino24.com/">casinos online</a>
casino
<a href="https://realmonetcasino.com/">online casino</a>
casino online
<a href="https://casinogambiba.com/">casinos online</a>
casinos
<a href="https://casinowellplay.com/">slots</a>
gambling
<a href="https://casinoongames.com/">online casinos</a>
casino game
<a href="https://casinotoplines.com/">online casinos</a>
回复 支持 反对

使用道具

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

手机版|小黑屋|网站地图|源码论坛 ( 海外版 )

GMT+8, 2024-11-24 18:10 , Processed in 0.069327 second(s), 26 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表