>  기사  >  php教程  >  PHP 커널 분석(8) - zend_compile

PHP 커널 분석(8) - zend_compile

黄舟
黄舟원래의
2016-12-19 11:30:571693검색

요약: 여기서 읽은 PHP 버전은 PHP-7.1.0 RC3이고, 코드를 읽는 플랫폼은 Linux입니다. int zend_eval_stringl(char *str, size_t str_len, zval *retval_ptr) 앞에서 읽은 zend_eval_stringlZEND_API로 돌아갑니다. , char *string_name) /* {{{ */ { ... new_o ...

여기서 읽는 PHP 버전은 PHP-7.1.0 RC3이고, 코드를 읽는 플랫폼은 Linux입니다

앞서 읽은 zend_eval_stringl로 돌아갑니다.

01    ZEND_API int zend_eval_stringl(char *str, size_t str_len, zval *retval_ptr, char *string_name) /* {{{ */    
02    {    
03        ...    
04        new_op_array = zend_compile_string(&pv, string_name);  // 这个是把php代码编译成为opcode的过程    
05        ...    
06        zend_execute(new_op_array, &local_retval); // 这个是具体的执行过程,执行opcode,把结果存储到local_retval中    
07        ...    
08        retval = SUCCESS;    
09        return retval;    
10    }

여기서 zend_execute는 두 단계를 수행합니다. 첫 번째 단계는 PHP를 opcode로 컴파일하고 파싱하는 과정입니다.

zend_compile_string

zend_compile_string 함수는 compile_string으로 추적할 수 있습니다

01    // 将一个字符串解析成为op_array    
02    zend_op_array *compile_string(zval *source_string, char *filename)    
03    {    
04         zend_lex_state original_lex_state;    
05         zend_op_array *op_array = NULL;    
06         zval tmp;    
07    
08        // 如果传进来要解析的字符为空,则返回null    
09         if (Z_STRLEN_P(source_string)==0) {    
10              return NULL;    
11         }    
12    
13         ZVAL_DUP(&tmp, source_string); // 复制source_string到zval中    
14         convert_to_string(&tmp); // 如果不是字符类型就转换为字符类型    
15         source_string = &tmp;    
16    
17         zend_save_lexical_state(&original_lex_state); // 保存lex上下文    
18         if (zend_prepare_string_for_scanning(source_string, filename) == SUCCESS) {  // 做编译前的准备    
19              BEGIN(ST_IN_SCRIPTING); // 设置状态为正在编译    
20              op_array = zend_compile(ZEND_EVAL_CODE); // 进行编译,并把生成结果放在op_array中    
21         }    
22    
23         zend_restore_lexical_state(&original_lex_state); // 恢复lex上下文    
24         zval_dtor(&tmp); // 释放tmp    
25    
26         return op_array;    
27    }

핵심 함수는 zend_compile입니다. 다음은 살펴봐야 할 몇 가지 사항입니다.

1 유형 변환을 수행하려면 Convert_to_string을 참조하세요. 이 함수는 모든 유형의 값을 zval의 문자열 유형으로 변환하는 것입니다.
2 zval_dtor, 이 함수는 모든 zval 변수를 재활용할 수 있습니다. 사용하기 매우 쉽습니다.
3 ZVAL_DUP은 복사용입니다. ZVAL_COPY와 차이점은 gc의 참조 횟수를 늘리는 것입니다.

위 내용은 PHP 커널 분석(8) - zend_compile 내용입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.