中文字幕在线一区二区在线,久久久精品免费观看国产,无码日日模日日碰夜夜爽,天堂av在线最新版在线,日韩美精品无码一本二本三本,麻豆精品三级国产国语,精品无码AⅤ片,国产区在线观看视频

      探討PHP函數的實現原理及性能

      時間:2024-07-07 12:50:24 PHP 我要投稿
      • 相關推薦

      探討PHP函數的實現原理及性能

        前言

        在任何語言中,函數都是最基本的組成單元。對于php的函數,它具有哪些特點?函數調用是怎么實現的?php函數的性能如何,有什么使用建議?本文將從原理出發進行分析結合實際的性能測試嘗試對這些問題進行回答,在了解實現的同時更好的編寫php程序。同時也會對一些常見的php函數進行介紹。

        php函數的分類

        在php中,橫向劃分的話,函數分為兩大類: user function(內置函數) 和internal function(內置函數)。前者就是用戶在程序中自定義的一些函數和方法,后者則是php本身提供的各類庫函數(比如sprintf、array_push等)。用戶也可以通過擴展的方法來編寫庫函數,這個將在后面介紹。對于user function,又可以細分為function(函數)和method(類方法),本文中將就這三種函數分別進行分析和測試。

        php函數的實現

        一個php函數最終是如何執行,這個流程是怎么樣的呢?

        要回答這個問題,我們先來看看php代碼的執行所經過的流程。

        從圖1可以看到,php實現了一個典型的動態語言執行過程:拿到一段代碼后,經過詞法解析、語法解析等階段后,源程序會被翻譯成一個個指令(opcodes),然后ZEND虛擬機順次執行這些指令完成操作。Php本身是用c實現的,因此最終調用的也都是c的函數,實際上,我們可以把php看做是一個c開發的軟件。通過上面描述不難看出,php中函數的執行也是被翻譯成了opcodes來調用,每次函數調用實際上是執行了一條或多條指令。

        對于每一個函數,zend都通過以下的數據結構來描述

        復制代碼 代碼如下:

        typedef union _zend_function {

        zend_uchar type; /* MUST be the first element of this struct! */

        struct {

        zend_uchar type; /* never used */

        char *function_name;

        zend_class_entry *scope;

        zend_uint fn_flags;

        union _zend_function *prototype;

        zend_uint num_args;

        zend_uint required_num_args;

        zend_arg_info *arg_info;

        zend_bool pass_rest_by_reference;

        unsigned char return_reference;

        } common;

        zend_op_array op_array;

        zend_internal_function internal_function;

        } zend_function;

        typedef struct _zend_function_state {

        HashTable *function_symbol_table;

        zend_function *function;

        void *reserved[ZEND_MAX_RESERVED_RESOURCES];

        } zend_function_state;

        其中type標明了函數的類型:用戶函數、內置函數、重載函數。Common中包含函數的基本信息,包括函數名,參數信息,函數標志(普通函數、靜態方法、抽象方法)等內容。另外,對于用戶函數,還有一個函數符號表,記錄了內部變量等,這個將在后面詳述。 Zend維護了一個全局function_table,這是一個大的hahs表。函數調用的時候會首先根據函數名從表中找到對應的zend_function。當進行函數調用時候,虛擬機會根據type的不同決定調用方法, 不同類型的函數,其執行原理是不相同的 。

        內置函數

        內置函數,其本質上就是真正的c函數,每一個內置函數,php在最終編譯后都會展開成為一個名叫zif_xxxx的function,比如我們常見的sprintf,對應到底層就是zif_sprintf。Zend在執行的時候,如果發現是內置函數,則只是簡單的做一個轉發操作。

        Zend提供了一系列的api供調用,包括參數獲取、數組操作、內存分配等。內置函數的參數獲取,通過zend_parse_parameters方法來實現,對于數組、字符串等參數,zend實現的是淺拷貝,因此這個效率是很高的。可以這樣說,對于php內置函數,其效率和相應c函數幾乎相同,唯一多了一次轉發調用。

        內置函數在php中都是通過so的方式進行動態加載,用戶也可以根據需要自己編寫相應的so,也就是我們常說的擴展。ZEND提供了一系列的api供擴展使用

        用戶函數

        和內置函數相比,用戶通過php實現的自定義函數具有完全不同的執行過程和實現原理。如前文所述,我們知道php代碼是被翻譯成為了一條條opcode來執行的,用戶函數也不例外,實際中每個函數對應到一組opcode,這組指令被保存在zend_function中。于是,用戶函數的調用最終就是對應到一組opcodes的執行。

        局部變量的保存及遞歸的實現

        我們知道,函數遞歸是通過堆棧來完成的。在php中,也是利用類似的方法來實現。Zend為每個php函數分配了一個活動符號表(active_sym_table),記錄當前函數中所有局部變量的狀態。所有的符號表通過堆棧的形式來維護,每當有函數調用的時候,分配一個新的符號表并入棧。當調用結束后當前符號表出棧。由此實現了狀態的保存和遞歸。

        對于棧的維護,zend在這里做了優化。預先分配一個長度為N的靜態數組來模擬堆棧,這種通過靜態數組來模擬動態數據結構的手法在我們自己的程序中也經常有使用,這種方式避免了每次調用帶來的內存分配、銷毀。ZEND只是在函數調用結束時將當前棧頂的符號表數據clean掉即可。因為靜態數組長度為N,一旦函數調用層次超過N,程序不會出現棧溢出,這種情況下zend就會進行符號表的分配、銷毀,因此會導致性能下降很多。在zend里面,N目前取值是32。因此,我們編寫php程序的時候,函數調用層次最好不要超過32。當然,如果是web應用,本身可以函數調用層次的深度。

        參數的傳遞 和內置函數調用zend_parse_params來獲取參數不同,用戶函數中參數的獲取是通過指令來完成的。函數有幾個參數就對應幾條指令。具體到實現上就是普通的變量賦值。通過上面的分析可以看出,和內置函數相比,由于是自己維護堆棧表,而且每條指令的執行也是一個c函數,用戶函數的性能相對會差很多,后面會有具體的對比分析。因此,如果一個功能有對應php內置函數實現的盡量不要自己重新寫函數去實現。

      【探討PHP函數的實現原理及性能】相關文章:

      關于php堆排序實現原理與應用方法04-01

      PHP的壓縮函數03-31

      淺析php函數的實例04-01

      PHP路由技術的原理與實踐03-10

      php中session的實現原理以及大網站應用應注意的問題分析04-01

      簡單介紹php構造函數用法03-15

      PHP中的排序函數區別分析03-31

      PHP中函數的使用說明03-30

      php外部執行命令函數03-31

      主站蜘蛛池模板: 国产一区二区三区 视频| 亚洲AV日韩Av无码久久| 一本久久综合亚洲鲁鲁五月夫| 久久久一本精品99久久精品77| 香格里拉县| 2021最新久久久视精品爱| 亚洲AV秘 无码一区二区在线| 岑巩县| 欧洲国产精品无码专区影院| 日本一区二区视频免费观看| 精品国产v一区二区三区| 改则县| 一区二区三区蜜桃在线视频| 亚洲高清美女久久av| 国产女主播福利一区在线观看| 一区二区三区在线视频免费观看| 精品亚洲少妇一区二区三区| 一本色道久久综合亚洲精| 女人被躁到高潮嗷嗷叫免费软 | 亚洲精品国产av一区二区| 亚洲人成影院在线高清| 亚洲精品中文字幕二区| 国产91AV免费播放| 茶陵县| 古丈县| 南宁市| 蓝山县| 金溪县| 阳曲县| 精品人妻av一区二区三区不卡| 天镇县| 亚洲国产精品久久久性色av| 日韩人妻中文字幕一区二区| 蜜臀av一区二区国产在线| 少妇熟女淫荡丰满| 国产极品视觉盛宴在线观看 | 九一成人AV无码一区二区三区| 国产欧美日本亚洲精品一5区| 亚洲综合久久久中文字幕| 午夜无码国产18禁| 国产美女a做受大片免费|