中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

為什么不使用include/require_once

發布時間:2021-10-12 11:20:43 來源:億速云 閱讀:139 作者:iii 欄目:編程語言

本篇內容介紹了“為什么不使用include/require_once”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

關于使用include還是include_once(以下,都包含require_once), 這個討論很長了, 結論也一直有, 就是盡量使用include, 而不是include_once, 以前最多的理由的是, include_once需要查詢一遍已加載的文件列表, 確認是否存在, 然后再加載.
誠然, 這個理由是對的, 不過, 我今天要說的, 是另外一個的原因.
我們知道, PHP去判斷一個文件是否被加載, 是需要得到這個文件的opened_path的, 意思是說, 比如:

<?phpset_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實現的一直不好, 會有一些未定義的問題, 比如:

<?phpset_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

(后記 2012-09-15 02:07:20: 這個APC的bug我已經修復: #63070)
排除這些技術因素, 我也一直認為, 我們應該使用include, 而不是include_once, 因為我們完全能做到自己規劃, 一個文件只被加載一次. 還可以借助自動加載, 來做到這一點.
你使用include_once, 只能證明, 你對自己的代碼沒信心.
所以, 建議大家, 不要再使用include_once

“為什么不使用include/require_once”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

php
AI

甘谷县| 双鸭山市| 永平县| 车险| 嘉荫县| 嘉鱼县| 永嘉县| 临海市| 灌南县| 彭州市| 公安县| 泸溪县| 孟连| 新民市| 禹州市| 察哈| 云梦县| 琼结县| 珲春市| 鸡东县| 台州市| 华安县| 大悟县| 邵东县| 凤阳县| 乳山市| 奉贤区| 方正县| 大城县| 株洲市| 慈利县| 临邑县| 东丰县| 阳城县| 抚远县| 武乡县| 工布江达县| 叶城县| 蓝山县| 中宁县| 谷城县|