<delect id="sj01t"></delect>
  1. <em id="sj01t"><label id="sj01t"></label></em>
  2. <div id="sj01t"></div>
    1. <em id="sj01t"></em>

            <div id="sj01t"></div>

            php內核分析之zend-compile

            時間:2025-10-17 20:16:59 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); /pic/p>

              ...

              zend_execute(new_op_array, &local_retval); /pic/p>

              ...

              retval = SUCCESS;

              return retval;

              }

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

              zend_compile_string

              zend_compile_string函數追下去可以追到compile_string

              /pic/p>

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

              {

              zend_lex_state original_lex_state;

              zend_op_array *op_array = NULL;

              zval tmp;

              /pic/p>

              if (Z_STRLEN_P(source_string)==0) {

              return NULL;

              }

              ZVAL_DUP(&tmp, source_string); /pic/p>

              convert_to_string(&tmp); /pic/p>

              source_string = &tmp;

              zend_save_lexical_state(&original_lex_state); /pic/p>

              if (zend_prepare_string_for_scanning(source_string, filename) == SUCCESS) { /pic/p>

              BEGIN(ST_IN_SCRIPTING); /pic/p>

              op_array = zend_compile(ZEND_EVAL_CODE); /pic/p>

              }

              zend_restore_lexical_state(&original_lex_state); /pic/p>

              zval_dtor(&tmp); /pic/p>

              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內核分析之擴展01-31

            php內核分析之zval11-19

            php內核分析之opcode02-15

            php內核分析之do-cli01-09

            php內核分析之全局變量12-14

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

            php內核分析之ZTS和zend-try08-24

            php學習之php配置03-11

            php學習之php預定義變量11-02

            <delect id="sj01t"></delect>
            1. <em id="sj01t"><label id="sj01t"></label></em>
            2. <div id="sj01t"></div>
              1. <em id="sj01t"></em>

                      <div id="sj01t"></div>
                      黄色视频在线观看