多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > php教程 > php中include_once和require_once性能分析

php中include_once和require_once性能分析

來源:程序員人生   發布時間:2014-03-20 21:06:42 閱讀次數:3484次

本文章來給各位朋友介紹php中include_once和require_once性能分析,有需要了解的朋友不防參考參考.

我們知道, PHP去判斷一個文件是否被加載, 是需要得到這個文件的opened_path的.

實例代碼如下:

  1.    set_include_path("/tmp/:/tmp2/"); 
  2.    include_once("2.php"); 
  3.    ?> 

當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實現的一直不好, 會有一些未定義的問題.

實例代碼如下:

  1.     set_include_path("/tmp"); 
  2.     function a($arg = array()) { 
  3.         include_once("b.php"); 
  4.     } 
  5.     a(); 
  6.     a(); 
  7.     ?> 

然后, 我們的b.php放置在”/tmp/b.php”, 內容如下:

實例代碼如下

  1.       class B {} 
  2.     ?> 

那么在打開apc.include_once_override的情況下, 連續訪問就會得到如下錯誤:

Fatal error – include() : Cannot redeclare class

排除這些技術因素, 我也一直認為, 我們應該使用include, 而不是include_once, 因為我們完全能做到自己規劃, 一個文件只被加載一次. 還可以借助自動加載, 來做到這一點.你使用include_once,只能證明, 你對自己的代碼沒信心.所以, 建議大家, 不要再使用include_once,不過我建義大家使用autoload和spl_autoload自動加載

(1) autoload機制概述

在使用PHP的OO模式開發系統時,通常大家習慣上將每個類的實現都存放在一個單獨的文件里,這樣會很容易實現對類進行復用,同時將來維護時也很便利.這 也是OO設計的基本思想之一.在PHP5之前,如果需要使用一個類,只需要直接使用include/require將其包含進來即可.下面是一個實際的例子:

實例代碼如下

  1. /* Person.class.php */ 
  2. class Person { 
  3. var $name$age
  4. function __construct ($name$age
  5. $this->name = $name
  6. $this->age = $age
  7. ?> 
  8. /* no_autoload.php */ 
  9. require_once (”Person.class.php”); 
  10. $person = new Person(”Altair”, 6); 
  11. var_dump ($person); 
  12. ?> 

在這個例子中,no-autoload.php文件需要使用Person類,它使用了require_once將其包含,然后就可以直接使用Person類來實例化一個對象.但隨著項目規模的不斷擴大,使用這種方式會帶來一些隱含的問題:如果一個PHP文件需要使用很多其它類,那么就需要很多的require/include語 句,這樣有可能會造成遺漏或者包含進不必要的類文件.如果大量的文件都需要使用其它的類,那么要保證每個文件都包含正確的類文件肯定是一個噩夢.

PHP5為這個問題提供了一個解決方案,這就是類的自動裝載(autoload)機制.autoload機制可以使得PHP程序有可能在使用類時才自動包含類文件,而不是一開始就將所有的類文件include進來,這種機制也稱為lazy loading.下面是使用autoload機制加載Person類的例子:

實例代碼如下:

  1. /* autoload.php */ 
  2. function __autoload($classname) { 
  3. require_once ($classname . “class.php”); 
  4. $person = new Person(”Altair”, 6); 
  5. var_dump ($person); 
  6. ?> 

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 亚洲大片免费 | 国产精品三级在线观看 | 日本一区二区不卡视频 | 日本高清中文字幕视频在线 | 亚洲不卡在线播放 | 宇都宫紫苑(rion)在线播放 | 国产成人综合手机在线播放 | 福利片 在线 | 国内视频自拍 | 国产品精人成福利视频 | 亚洲视频在线一区二区三区 | 久久国产经典视频 | 456在线 | 成人a毛片高清视频 | 久久综合精品国产一区二区三区 | 羞羞在线观看 | 欧美自拍偷拍视频 | 国产亚洲一区二区精品 | 久久久久亚洲精品一区二区三区 | 免费在线一级毛片 | 我想看一级毛片 | 在线成人免费观看国产精品 | 婷婷我也去 | 男人和女人全黄一级毛片 | 久久国产精品一国产精品 | 日韩精品欧美激情亚洲综合 | 中文亚洲日韩欧美 | 亚洲作爱视频 | 国产视频欧美 | japanesexxx在线播放 | 久久精品这里是免费国产 | 久久久亚洲国产精品主播 | 日本一级毛片视频无遮挡免费 | 国产jlzzjlzz视频免费 | 网站免费视频 | 欧美性videosex18 | 伊人精品成人久久综合欧美 | 爱爱综合| 小说区| 国产综合在线观看 | 亚洲欧美一区二区三区不卡 |