日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人文社科 > 生活经验 >内容正文

生活经验

深入浅出PHP(Exploring PHP)

發(fā)布時(shí)間:2023/11/27 生活经验 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深入浅出PHP(Exploring PHP) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一直以來(lái),橫觀國(guó)內(nèi)的PHP現(xiàn)狀,很少有專(zhuān)門(mén)介紹PHP內(nèi)部機(jī)制的書(shū)。呵呵,我會(huì)隨時(shí)記錄下研究的心得,有機(jī)會(huì)的時(shí)候,匯總成書(shū)。:)

今天這篇,我內(nèi)心是想打算做為一個(gè)導(dǎo)論:

PHP是一個(gè)被廣泛應(yīng)用的腳本語(yǔ)言,因?yàn)樗某晒?#xff0c;所以很多時(shí)候,我們應(yīng)用PHP的時(shí)候是更不不需要考慮底層到底是怎么實(shí)現(xiàn)的。我相信大多數(shù)的 PHP程序 員是不會(huì)去考慮這一點(diǎn)的。從我接觸PHP開(kāi)始,到今天也就是3年,這三年里,前倆年我一直都是在”用”P(pán)HP,每次寫(xiě)出來(lái)一段腳本,我就會(huì)想“恩,不用擔(dān) 心,PHP解釋器會(huì)知道我想做什么的”,直到去年來(lái)到雅虎,接受了一個(gè)工作,是做一個(gè)PHP的Extension,從這個(gè)時(shí)候開(kāi)始,我就好奇于新接觸的一 大堆的新鮮事物,zend, TSRM, zval, hashtable, op_array…

于是我到處查閱資料,每次獲得一篇好的文章,或者一段好的文字我就會(huì)如獲珍寶,打印保存起來(lái),細(xì)細(xì)研讀。我發(fā)現(xiàn),國(guó)內(nèi)關(guān)于PHP內(nèi)部的資料真是少的 可憐, 不知道是因?yàn)槎玫娜硕嗟遣辉敢夥窒?#xff0c;還是懂得的人本來(lái)就少,所以,這條路,我走的很辛苦。于是,就會(huì)有了這篇文章。

在這篇文章中,我會(huì)從整個(gè)PHP的執(zhí)行期入手,大致的介紹下各個(gè)階段,詞法分析,語(yǔ)法分析,op code等等,以后的文章我會(huì)再詳細(xì)介紹每個(gè)階(當(dāng)然,如果你急不可耐的想知道詳細(xì),呵呵,那么可以直接聯(lián)系我)。

從最初我們編寫(xiě)的PHP腳本->到最后腳本被執(zhí)行->得到執(zhí)行結(jié)果,這個(gè)過(guò)程,其實(shí)可以分為如下幾個(gè)階段(鄙視:CSDN不能上圖):

首先,Zend Engine(ZE),調(diào)用詞法分析器(Lex生成的,源文件在 Zend/zend_language_sanner.l), 將我們要執(zhí)行的PHP源文件,去掉空格 ,注釋,分割成一個(gè)一個(gè)的token。

然后,ZE會(huì)將得到的token forward給語(yǔ)法分析器(yacc生成, 源文件在 Zend/zend_language_parser.y),生成一個(gè)一個(gè)的op code,opcode一般會(huì)以op array的形式存在,它是PHP執(zhí)行的中間語(yǔ)言。

最后,ZE調(diào)用zend_executor來(lái)執(zhí)行op array,輸出結(jié)果。


ZE是一個(gè)虛擬機(jī),正是由于它的存在,所以才能使得我們寫(xiě)PHP腳本,完全不需要考慮所在的操作系統(tǒng)類(lèi)型是什么。ZE是一個(gè)CISC(復(fù)雜指令處理器), 它支持150條指令(具體指令在 Zend/zend_vm_opcodes.h),包括從最簡(jiǎn)單的ZEND_ECHO(echo)到復(fù)雜的 ZEND_INCLUDE_OR_EVAL(include,require),所有我們編寫(xiě)的PHP都會(huì)最終被處理為這150條指令(op code)的序列,從而最終被執(zhí)行。

那有什么辦法可以看到我們的PHP腳本,最終被“翻譯”成什么樣的呢? 也就是說(shuō),op code張的什么樣子呢? 呵呵,達(dá)到這個(gè),我們需要重新編譯PHP,修改它的compile_file和zend_execute函數(shù)。不過(guò),在PECL中已經(jīng)有這樣的模塊,可以 讓我們直接使用了,那就是由 Derick Rethans開(kāi)發(fā)的VLD (Vulcan Logic Dissassembler)模塊。你只要下載這個(gè)模塊,并把他載入PHP中,就可以通過(guò)簡(jiǎn)單的設(shè)置,來(lái)得到腳本翻譯的結(jié)果了。具體關(guān)于這個(gè)模塊的使用說(shuō) 明-雅虎一下,你就知道^_^。

接下來(lái),讓我們嘗試用VLD來(lái)查看一段簡(jiǎn)單的PHP腳本的中間語(yǔ)言。

原始代碼:

<?php $i = This is a string; //I am comments echo $i. that has been echoed to screen; ?>

采用VLD得到的op codes:

filename:/home/Desktop/vldOutOne.php function name: (null) number of ops: 7 line #? op? ? ? ? ? ? ? ?? fetch? ? ?? ext? operands

——————————————————————————————————————————-

2 0 FETCH_W local $0, i 1 ASSIGN $0, This+is+a+string 4 2 FETCH_R local $2, i 3 CONCAT ~3, $2,+that+has+been+echoed+to+screen 4 ECHO ~3 6 5 RETURN 1 6 ZEND_HANDLE_EXCEPTION

我們可以看到,源文件中的注釋,在op code中,已經(jīng)沒(méi)有了,所以不用擔(dān)心注釋太多會(huì)影響你的腳本執(zhí)行時(shí)間(實(shí)際上,它是會(huì)影響ZE的詞法處理階段的用時(shí)而已)。

現(xiàn)在我們來(lái)一條一條的分析這段op codes,每一條op code 又叫做一條op_line,都由如下7個(gè)部分,在zend_compile.h中,我們可以看到如下定義:

struct _zend_op { opcode_handler_t handler; znode result; znode op1; znode op2; ulong extended_value; uint lineno; zend_uchar opcode; };

其中,opcode字段指明了這操作類(lèi)型,handler指明了處理器,然后有倆個(gè)操作數(shù),和一個(gè)操作結(jié)果。

  1. FETCH_W, 是以寫(xiě)的方式獲取一個(gè)變量,此處是獲取變量名”i”的變量于$0(*zval)。
  2. 將字符串”this+is+a+string”賦值(ASSIGN)給$0
  3. 字符串連接
  4. 顯示

可以看出,這個(gè)很類(lèi)似于很多同學(xué)大學(xué)學(xué)習(xí)編譯原理時(shí)候的三元式,不同的是,這些中間代碼會(huì)被Zend VM(Zend虛擬機(jī))直接執(zhí)行。

真正負(fù)責(zé)執(zhí)行的函數(shù)是,zend_execute, 查看zend_execute.h:

  1. ZEND_API extern void (*zend_execute)(zend_op_array *op_array TSRMLS_DC);

可以看出, zend_execute接受zend_op_array*作為參數(shù)。

  1. ?struct _zend_op_array {
  2. ????/* Common elements */
  3. ????zend_uchar type;
  4. ????char *function_name;
  5. ????zend_class_entry *scope;
  6. ????zend_uint fn_flags;
  7. ????union _zend_function *prototype;
  8. ????zend_uint num_args;
  9. ????zend_uint required_num_args;
  10. ????zend_arg_info *arg_info;
  11. ????zend_bool pass_rest_by_reference;
  12. ????unsigned char return_reference;
  13. ????/* END of common elements */
  14. ?
  15. ????zend_uint *refcount;
  16. ?
  17. ????zend_op *opcodes;
  18. ????zend_uint last, size;
  19. ?
  20. ????zend_compiled_variable *vars;
  21. ????int last_var, size_var;
  22. ?
  23. ????zend_uint T;
  24. ?
  25. ????zend_brk_cont_element *brk_cont_array;
  26. ????zend_uint last_brk_cont;
  27. ????zend_uint current_brk_cont;
  28. ?
  29. ????zend_try_catch_element *try_catch_array;
  30. ????int last_try_catch;
  31. ?
  32. ????/* static variables support */
  33. ????HashTable *static_variables;
  34. ?
  35. ????zend_op *start_op;
  36. ????int backpatch_count;
  37. ?
  38. ????zend_bool done_pass_two;
  39. ????zend_bool uses_this;
  40. ?
  41. ????char *filename;
  42. ????zend_uint line_start;
  43. ????zend_uint line_end;
  44. ????char *doc_comment;
  45. ????zend_uint doc_comment_len;
  46. ?
  47. ????void *reserved[ZEND_MAX_RESERVED_RESOURCES];
  48. };

可以看到,zend_op_array的結(jié)構(gòu)和zend_function的結(jié)構(gòu)很像(參看我的其他文章), 對(duì)于在全局作用域的代碼,就是不包含在任何function內(nèi)的op_array,它的function_name為NULL。結(jié)構(gòu)中的opcodes保 存了屬于這個(gè)op_array的op code數(shù)組,zend_execute會(huì)從start_op開(kāi)始,逐條解釋執(zhí)行傳入的每條op code, 從而實(shí)現(xiàn)我們PHP腳本想要的結(jié)果。

下一次,我將介紹PHP變量的靈魂 – zval, 你將會(huì)看到PHP是如何實(shí)現(xiàn)它的變量傳遞,類(lèi)型戲法,等等。

總結(jié)

以上是生活随笔為你收集整理的深入浅出PHP(Exploring PHP)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 热久久中文字幕 | 夜夜骑天天操 | 性色福利 | 黄在线免费观看 | 蜜臀av色欲a片无码精品一区 | 骚鸭av| 一区二区激情视频 | 欧美激情91 | 日本四虎影院 | 一区二区三区日韩视频 | 加勒比一区二区三区 | 激情 小说 亚洲 图片 伦 | 亚洲熟女少妇一区二区 | 中国黄色片子 | 人人艹视频 | 亚洲国产精品女人久久久 | 成人无码www在线看免费 | 中文字幕在线免费观看视频 | 亚洲天堂最新 | 极品美女啪啪 | 吃瓜网今日吃瓜 热门大瓜 色婷在线 | 美女国产毛片a区内射 | 亚洲精品视频在线观看视频 | 国产一区二区三区视频 | 久免费一级suv好看的国产 | 亚洲av无码电影在线播放 | 日韩av一区二区三区在线观看 | 国产精品 欧美激情 | 妖精视频在线观看 | 在线观看精品视频 | 美女狂揉羞羞的视频 | 日本久久99 | 91视频中文字幕 | 久久久www免费人成人片 | 国产99久久久国产精品免费看 | 国产wwwxxx | 国产精品suv一区二区69 | av电影网站在线观看 | 伊人伊色 | 日韩两性视频 | 丰满人妻一区二区三区大胸 | 美色视频 | 久久久免费av | 猛1被调教成公厕尿便失禁网站 | 中国极品少妇videossexhd 就要干就要操 | 中文字幕第十一页 | 古代黄色一级片 | 欧美大黄 | 四虎成人在线 | 天天看天天摸天天操 | 永久免费视频网站直接看 | 亚洲国产精品成人va在线观看 | 中文字字幕在线中文乱码电影 | 婷婷色五 | 污视频网站免费在线观看 | 丰满人妻妇伦又伦精品国产 | 青娱乐伊人| 亚洲色图 校园春色 | 天天看视频 | 天天摸天天做 | 瑟瑟av | 亚洲欧洲一区二区在线观看 | 麻豆毛片| 亚洲激情小视频 | 九九热视频精品在线观看 | 免费看黄20分钟 | 岛国片在线播放 | 久久一线 | 国产伦精品一区二区三区视频痴汉 | 18日本xxxxxxxxx95 国产又好看的毛片 | 青青草一区二区三区 | 好吊一区 | 久久国产精品影院 | 色香视频首页 | 日本一区二区视频免费 | 成人在线观看免费网站 | 欧美日韩高清不卡 | 日韩欧美一级在线 | 裸体黄色片| 91香焦视频 | 午夜av剧场 | 欧美黄色小说视频 | 欧美一区二区在线视频观看 | 国产精品无码av在线有声小说 | 婷婷国产成人精品视频 | 亚洲色图28p | 草莓视频在线观看18 | 国产探花在线精品一区二区 | 亚洲自拍p | 蜜桃中文字幕 | 天堂av2014| 美女午夜激情 | 青青草久久爱 | 欧美另类tv| 亚洲天堂福利视频 | 1024亚洲| 国产极品一区 | 91丨国产丨捆绑调教 | www.av成人 |