這里閱讀的php版本為PHP-7.1.0 RC3,閱讀代碼的平臺(tái)為linux

實(shí)際上,從這個(gè)函數(shù)開始,就已經(jīng)進(jìn)入到了zend引擎的范圍了。

zend_eval_string_ex(exec_direct, NULL, "Command line code", 1)

實(shí)際上是調(diào)用Zend/zend_execute_API.c

zend_eval_stringl_ex(str, strlen(str), retval_ptr, string_name, handle_exceptions);

再進(jìn)去是調(diào)用

result = zend_eval_stringl(str, str_len, retval_ptr, string_name);

這里的retval_ptr為NULL,string_name為"Command line code", str為"echo 12;"

zend_eval_stringl

其實(shí)這個(gè)函數(shù)主流程并不復(fù)雜。簡化下來就如下

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); // 這個(gè)是把php代碼編譯成為opcode的過程 ...
    zend_execute(new_op_array, &local_retval); 
        		

網(wǎng)友評論