<pre id="bbfd9"><del id="bbfd9"><dfn id="bbfd9"></dfn></del></pre>

          <ruby id="bbfd9"></ruby><p id="bbfd9"><mark id="bbfd9"></mark></p>

          <p id="bbfd9"></p>

          <p id="bbfd9"><cite id="bbfd9"></cite></p>

            <th id="bbfd9"><form id="bbfd9"><dl id="bbfd9"></dl></form></th>

            <p id="bbfd9"><cite id="bbfd9"></cite></p><p id="bbfd9"></p>
            <p id="bbfd9"><cite id="bbfd9"><progress id="bbfd9"></progress></cite></p>
            php語言

            php內核分析之zend-compile

            時間:2025-05-17 16:37:14 php語言 我要投稿
            • 相關推薦

            php內核分析之zend-compile

              學習PHP的時候也許你會用到關于PHP內核方面的知識,以下是百分網小編精心為大家整理的php內核分析之zend_compile,希望對大家有所幫助!更多內容請關注應屆畢業生網!

              這里閱讀的php版本為PHP-7.1.0 RC3,閱讀代碼的平臺為linux

              回到之前看的zend_eval_stringl

              ZEND_API int zend_eval_stringl(char *str, size_t str_len, zval *retval_ptr, char *string_name) /* {{{ */

              {

              ...

              new_op_array = zend_compile_string(&pv, string_name); // 這個是把php代碼編譯成為opcode的過程

              ...

              zend_execute(new_op_array, &local_retval); // 這個是具體的執行過程,執行opcode,把結果存儲到local_retval中

              ...

              retval = SUCCESS;

              return retval;

              }

              這里的zend_execute執行了兩步,第一步是把php編譯解析成為opcode的過程,我們就先看這個。

              zend_compile_string

              zend_compile_string函數追下去可以追到compile_string

              // 將一個字符串解析成為op_array

              zend_op_array *compile_string(zval *source_string, char *filename)

              {

              zend_lex_state original_lex_state;

              zend_op_array *op_array = NULL;

              zval tmp;

              // 如果傳進來要解析的字符為空,則返回null

              if (Z_STRLEN_P(source_string)==0) {

              return NULL;

              }

              ZVAL_DUP(&tmp, source_string); // 復制source_string到zval中

              convert_to_string(&tmp); // 如果不是字符類型就轉換為字符類型

              source_string = &tmp;

              zend_save_lexical_state(&original_lex_state); // 保存lex上下文

              if (zend_prepare_string_for_scanning(source_string, filename) == SUCCESS) { // 做編譯前的準備

              BEGIN(ST_IN_SCRIPTING); // 設置狀態為正在編譯

              op_array = zend_compile(ZEND_EVAL_CODE); // 進行編譯,并把生成結果放在op_array中

              }

              zend_restore_lexical_state(&original_lex_state); // 恢復lex上下文

              zval_dtor(&tmp); // 釋放tmp

              return op_array;

              }

              里面最核心的就是zend_compile了。這里的幾個點可以看看:

              1 這么做類型轉換,參考convert_to_string。這個函數就是把任意類型的值轉換為zval的string類型。

              2 zval_dtor,這個函數是能把任意的zval變量做回收。非常好用。

              3 ZVAL_DUP,是進行復制,它和ZVAL_COPY的區別在于是否增加gc的引用計數。

              下面又找到關鍵點:zend_compi

            【php內核分析之zend-compile】相關文章:

            php內核分析之zval09-07

            php內核分析之擴展10-03

            php內核分析之opcode08-04

            php內核分析之全局變量09-03

            php內核分析之do-cli05-30

            php內核分析之sapi-module-struct10-17

            php內核分析之ZTS和zend-try07-18

            php學習之php配置07-15

            php學習之php預定義變量07-29

                    <pre id="bbfd9"><del id="bbfd9"><dfn id="bbfd9"></dfn></del></pre>

                    <ruby id="bbfd9"></ruby><p id="bbfd9"><mark id="bbfd9"></mark></p>

                    <p id="bbfd9"></p>

                    <p id="bbfd9"><cite id="bbfd9"></cite></p>

                      <th id="bbfd9"><form id="bbfd9"><dl id="bbfd9"></dl></form></th>

                      <p id="bbfd9"><cite id="bbfd9"></cite></p><p id="bbfd9"></p>
                      <p id="bbfd9"><cite id="bbfd9"><progress id="bbfd9"></progress></cite></p>
                      飘沙影院