天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

請(qǐng)離開include_once和require_once

誠然, 這個(gè)理由是對(duì)的, 不過, 我今天要說的, 是另外一個(gè)的原因.
我們知道, php去判斷一個(gè)文件是否被加載, 是需要得到這個(gè)文件的opened_path的, 意思是說, 比如:
復(fù)制代碼 代碼如下:
    <?php
    set_include_path("/tmp/:/tmp2/");
    include_once("2.php");
    ?>

當(dāng)php看到include_once “2.php”的時(shí)候, 他并不知道這個(gè)文件的實(shí)際路徑是什么, 也就無法從已加載的文件列表去判斷是否已經(jīng)加載, 所以在include_once的實(shí)現(xiàn)中, 會(huì)首先嘗試解析這個(gè)文件的真實(shí)路徑(對(duì)于普通文件這個(gè)解析僅僅類似是檢查getcwd和文件路徑, 所以如果是相對(duì)路徑, 一般是不會(huì)成功), 如果解析成功, 則查找EG(include_files), 如果存在則說明包含過了, 返回, 否則open這個(gè)文件, 從而得到這個(gè)文件的opened_path. 比如上面的例子, 這個(gè)文件存在于 “/tmp2/2.php”.

然后, 得到了這個(gè)opened_path以后, php去已加載的文件列表去查找, 是否已經(jīng)包含, 如果沒有包含, 那么就直接compile, 不再需要open file了.

1. 嘗試解析文件的絕對(duì)路徑, 如果能解析成功, 則檢查EG(included_files), 存在則返回, 不存在繼續(xù)
2. 打開文件, 得到文件的打開路徑(opened path)
3. 拿opened path去EG(included_files)查找, 是否存在, 如果存在則返回, 不存在繼續(xù)
4. 編譯文件(compile_file)

這個(gè)在大多數(shù)情況下, 不是問題, 然而問題出在當(dāng)你使用APC的時(shí)候…

在使用APC的時(shí)候, APC劫持了compile_file這個(gè)編譯文件的指針, 從而直接從cache中得到編譯結(jié)果, 避免了對(duì)實(shí)際文件的open, 避免了對(duì)open的system call.

然而, 當(dāng)你在代碼中使用include_once的時(shí)候, 在compile_file之前, php已經(jīng)嘗試去open file了, 然后才進(jìn)入被APC劫持的compile file中, 這樣一來, 就會(huì)產(chǎn)生一次額外的open操作. 而APC正是為了解決這個(gè)問題, 引入了include_once_override, 在include_once_override開啟的情況下, APC會(huì)劫持php的ZEND_INCLUDE_OR_EVAL opcode handler, 通過stat來確定文件的絕對(duì)路徑, 然后如果發(fā)現(xiàn)沒有被加載, 就改寫opcode為include, 做一個(gè)tricky解決方案.

但是, 很可惜, 如我所說, APC的include_once_override實(shí)現(xiàn)的一直不好, 會(huì)有一些未定義的問題, 比如:
復(fù)制代碼 代碼如下:
    <?php
    set_include_path("/tmp");
    function a($arg = array()) {
        include_once("b.php");
    }

    a();
    a();
    ?>

然后, 我們的b.php放置在”/tmp/b.php”, 內(nèi)容如下:
復(fù)制代碼 代碼如下:
    <?php
      class B {}
    ?>

那么在打開apc.include_once_override的情況下, 連續(xù)訪問就會(huì)得到如下錯(cuò)誤:
Fatal error - include() : Cannot redeclare class

排除這些技術(shù)因素, 我也一直認(rèn)為, 我們應(yīng)該使用include, 而不是include_once, 因?yàn)槲覀兺耆茏龅阶约阂?guī)劃, 一個(gè)文件只被加載一次. 還可以借助自動(dòng)加載, 來做到這一點(diǎn).

你使用include_once,只能證明, 你對(duì)自己的代碼沒信心.
所以, 建議大家, 不要再使用include_once

php技術(shù)請(qǐng)離開include_once和require_once,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 脱jk裙的美女露小内内无遮挡 | 日韩伦理电影秋霞影院 | 大肚婆孕妇网 | 亚洲 欧美 国产在线视频 | 接吻吃胸摸下面啪啪教程 | 色欲AV亚洲午夜精品无码 | 袖珍人与大黑人性视频 | 色噜噜狠狠一区二区三区 | 亚洲国产av | 99re6久久热在线视频 | 26uuu老色哥 259luxu高跟黑色丝袜系列 | 永久adc视频年龄确认 | 湖南张丽大战黑人hd视频 | 果冻传媒色AV国产播放 | 国产精品96久久久久久AV网址 | 日本美女抠逼 | 5G在线观看免费年龄确认 | 国产精品视频人人做人人爽 | 伊人成色综合人网 | 国产亚洲国际精品福利 | 国产日韩欧美有码在线视频 | 97久久精品视频 | 成年AV动漫 | 中文字幕在线视频在线看 | 中文字幕在线不卡精品视频99 | 色呦呦导航| 57PAO强力打造高清免费 | 共妻肉多荤文高h一女n男 | 亚洲精品视频久久 | 日韩精品 中文字幕 有码 | 精品一区二区三区高清免费观看 | japonensis护士 | 国产免费播放一区二区三区 | 蜜臀亚洲AV永久无码精品老司机 | 九色PORNY真实丨国产免费 | 日韩精品一区二区亚洲AV观看 | 羞羞答答影院在线 | 久久精品国产免费中文 | 精品无人区麻豆乱码1区2 | 久久99re7在线视频精品 | 午夜家庭影院 |