<address id="ousso"></address>
<form id="ousso"><track id="ousso"><big id="ousso"></big></track></form>
  1. 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

    <address id="ousso"></address>
    <form id="ousso"><track id="ousso"><big id="ousso"></big></track></form>
    1. 日日做夜狠狠爱欧美黑人