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

從php核心代碼分析require和include的區別

深入理解php之require/include順序 http://www.jb51.NET/article/25867.htm
普及
php手冊中:

require() is identical to include() except upon failure it will also produce a fatal E_ERROR level error. In other words, it will halt the script whereas include() only emits a warning (E_WARNING) which allows the script to continue.

就是說在失敗的時候,require是會中止php運行的,而include是可以繼續運行的。
倒底有什么樣的區別呢?我們帶著這個疑問來一起進入php的核心代碼。
下面是一個php運行過程的圖(這個圖是出自哪里的?鳥哥畫的?)
<a href=/itjie/phpjishu/ target=_blank class=infotextkey>php</a>

補習一下:lex是代碼掃描器,掃描代碼用的,yacc是Yet Another Compiler Compiler,作用是把任何一種代碼的語法轉成yacc語法,yacc就是解析器(真TMD繞)。
lex在c下的后綴是*.l yacc是*.y

正題
下面看操作記錄:

cc@cc-laptop:/opt/workspace$ svn checkout http://svn.php.NET/repository/php/php-src/branches/php_5_3 php-src-5.3
從svn取最新的php源代碼。

開始深入:

cc@cc-laptop:/opt/workspace/php-src-5.3$ find . -type f -name “*.l” -exec grep -Hn “require_once” {} /;
./Zend/zend_language_scanner.l:1093:”require_once” {
尋找lex代碼掃描器文件中出現require_once的地方,zend_language_scanner.l的1093行。
1093 “require_once” {
1094 return T_REQUIRE_ONCE;
1095 }

然后再搜一下T_REQUIRE_ONCE,

cc@cc-laptop:/opt/workspace/php-src-5.3$ find . -type f -name “*.y” -exec grep -Hn “T_INCLUDE” {} /;
./Zend/zend_language_parser.y:52:%left T_INCLUDE T_INCLUDE_ONCE T_EVAL T_REQUIRE T_REQUIRE_ONCE
./Zend/zend_language_parser.y:985: | T_INCLUDE expr { zend_do_include_or_eval(ZEND_INCLUDE, &$$, &$2 TSRMLS_CC); }
./Zend/zend_language_parser.y:986: | T_INCLUDE_ONCE expr { zend_do_include_or_eval(ZEND_INCLUDE_ONCE, &$$, &$2 TSRMLS_CC); }

在985行附近,有這樣一群代碼:

internal_functions_in_yacc:
T_ISSET ‘(‘ isset_variables ‘)' { $$ = $3; }
| T_EMPTY ‘(‘ variable ‘)' { zend_do_isset_or_isempty(ZEND_ISEMPTY, &$$, &$3 TSRMLS_CC); }
| T_INCLUDE expr { zend_do_include_or_eval(ZEND_INCLUDE, &$$, &$2 TSRMLS_CC); }
| T_INCLUDE_ONCE expr { zend_do_include_or_eval(ZEND_INCLUDE_ONCE, &$$, &$2 TSRMLS_CC); }
| T_EVAL ‘(‘ expr ‘)' { zend_do_include_or_eval(ZEND_EVAL, &$$, &$3 TSRMLS_CC); }
| T_REQUIRE expr { zend_do_include_or_eval(ZEND_REQUIRE, &$$, &$2 TSRMLS_CC); }
| T_REQUIRE_ONCE expr { zend_do_include_or_eval(ZEND_REQUIRE_ONCE, &$$, &$2 TSRMLS_CC); }
;

于是乎,我們需要繼續深入尋找zend_do_include_or_eval,

cc@cc-laptop:/opt/workspace/php-src-5.3$ find . -type f -name “*.c” -exec grep -Hn “zend_do_include_or_eval” {} /;
./Zend/zend_compile.c:4317:void zend_do_include_or_eval(int type, znode *result, const znode *op1 TSRMLS_DC) /* {{{ */

zend_do_include_or_eval中組裝了一個結構體,ZEND_INCLUDE_OR_EVAL。

再在zend_vm_def.h中找到ZEND_VM_HANDLER(73, ZEND_INCLUDE_OR_EVAL, CONST|TMP|VAR|CV, ANY):
switch (Z_LVAL(opline->op2.u.constant)) {代碼略}

中間關鍵的一句是:
new_op_array = compile_filename(Z_LVAL(opline->op2.u.constant), inc_filename TSRMLS_CC);

在zend_complie.h文件中:
ZEND_API zend_op_array *compile_filename(int type, zval *filename TSRMLS_DC);

這個函數定義在zend_language_scaner.l文件中,找出最核心的代碼:

if (open_file_for_scanning(file_handle TSRMLS_CC)==FAILURE) {
// require與include的差別:錯誤信息的顯示級別(有bailout和無bailout)
if (type==ZEND_REQUIRE) { //require時
zend_message_dispatcher(ZMSG_FAILED_REQUIRE_FOPEN, file_handle->filename TSRMLS_CC);
zend_bailout();
} else {
zend_message_dispatcher(ZMSG_FAILED_INCLUDE_FOPEN, file_handle->filename TSRMLS_CC);
}
compilation_successful=0;
} else {代碼略}

繼續追蹤zend_message_dispatcher可以在main/main.c文件中找到php_message_handler_for_zend函數:

//include輸出錯誤信息時的級別為:E_WARNING
case ZMSG_FAILED_INCLUDE_FOPEN:
php_error_docref(“function.include” TSRMLS_CC, E_WARNING, “Failed opening ‘%s' for inclusion (include_path='%s')”, php_strip_url_passwd((char *) data), STR_PRINT(PG(include_path)));
break;
//require輸出錯誤信息時的級別為:E_COMPILE_ERROR
代碼略

總結
和開頭php手冊所說完全一致,require和include的區別在于,出現錯誤時,一個是error一個是warning。

php技術從php核心代碼分析require和include的區別,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 亚洲免费人成 久久 | qvod影院| 国产视频精品在线偷拍 | 97久久伊人精品影院 | 欧美白妞大战非洲大炮 | 亚洲野狼综合网站 | 超碰在线视频人人AV | 国产精品婷婷久青青原 | 99在线视频免费观看视频 | 国产精品成人A蜜柚在线观看 | 无套内射无矿码免费看黄 | 国产全部视频列表支持手机 | 午夜性伦鲁啊鲁免费视频 | 俄罗斯美女破处 | 国产亚洲精品影视在线 | 日韩精品一区二区三区色欲AV | 99久热这里精品免费 | 中文字幕亚洲欧美日韩2019 | 欧美精品AV精品一区视频 | 麻豆狠色伊人亚洲综合网站 | 岛国大片在线播放免费 | 色综合 亚洲 自拍 欧洲 | 免费高清毛片 | 国产亚洲AV无码成人网站 | fyeex性欧美人与曾 | 色-情-伦-理一区二区三区 | 欧美午夜a级精美理论片 | 喜马拉雅听书免费版 | 国产精品99久久久久久AV | 久久操韩国自偷拍 | 果冻传媒在线观看视频 | 同桌上课把奶露出来给我玩 | 偷拍亚洲制服另类无码专区 | 武侠古典久久亚洲精品 | 美女久久久| 午夜神器老司机高清无码 | 日日射日日操 | 国产成人无码AV麻豆 | 成人亚洲视频 | 国产国产乱老熟女视频网站97 | 国产精品无码中文在线AV |