Heim  >  Artikel  >  php教程  >  PHP-Kernel-Analyse (8) – zend_compile

PHP-Kernel-Analyse (8) – zend_compile

黄舟
黄舟Original
2016-12-19 11:30:571730Durchsuche

Zusammenfassung: Die hier gelesene PHP-Version ist PHP-7.1.0 RC3 und die Plattform zum Lesen des Codes ist Linux. Gehen Sie zurück zur zend_eval_stringlZEND_API, die wir vor int zend_eval_stringl(char *str, size_t str_len, zval *retval_ptr gelesen haben , char *string_name) /* {{{ */ { ... new_o ...

Die hier gelesene PHP-Version ist PHP-7.1.0 RC3, und die Plattform zum Lesen des Codes ist Linux

Gehen Sie zurück zum zend_eval_stringl, den wir zuvor gelesen haben

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    }

Der erste Schritt ist der Prozess des Kompilierens und Parsens von PHP in Opcode.

zend_compile_string

Die zend_compile_string-Funktion kann auf „compile_string“ zurückgeführt werden

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    }

Die Kernfunktion ist zend_compile. Hier sind einige Punkte, die Sie beachten sollten:

1 Informationen zur Typkonvertierung finden Sie unter „convert_to_string“. Diese Funktion dient dazu, jeden Werttyp in den Zeichenfolgentyp von zval umzuwandeln.
2 zval_dtor, diese Funktion kann jede Zval-Variable recyceln. Sehr einfach zu bedienen.
3 ZVAL_DUP dient zum Kopieren. Der Unterschied zwischen ZVAL_COPY und ZVAL_COPY besteht darin, ob der Referenzzähler von gc erhöht werden soll.

Das Obige ist der Inhalt der PHP-Kernel-Analyse (8) – zend_compile. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn).


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn