36-変数のライフサイクル

2181 ワード

36-変数のライフサイクル
前の章で述べたように,PHPにおける変数の格納方式,すなわちすべての変数がzval構造に保存されていることが分かった.PHPカーネルが変数の定義方法と役割ドメインをどのように実現するかについて説明します.
ZEで語法と文法の解析を行った後、具体的なopcodeが生成され、これらのopcodeは最終的にexecute関数(Zend/zend_vm_execute.h:46)によって解釈されて実行される.excute関数には、次のコードがあります.
while (1) { 
    ... 
    if ((ret = EX(opline)->handler(execute_data TSRMLS_CC)) > 0) {
        switch (ret) {
            case 1:
                EG(in_execution) = original_in_execution;
                return;
            case 2:
                op_array = EG(active_op_array);
                goto zend_vm_enter;
            case 3:
                execute_data = EG(current_execute_data);
            default:
                break;
        }     
    }     
    ...
}

ここのEX(opline)->handler(...)はop_をarrayでの操作手順は、変数付与操作がZEND_ASSIGN_SPEC_CV_CONST_HANDLER()関数で行います.ZEND_ASSIGN_SPEC_CV_CONST_HANDLERでは、いくつかの変数タイプの判断を行い、メモリにzvalを割り当て、変数の値を格納します.変数名とこのzvalを指すポインタは、シンボルテーブルに格納されます.ZEND_ASSIGN_SPEC_CV_CONST_HANDLERの最後にZENDを呼び出すVM_NEXT_OPCODE()将op_arrayのポインタを次のoplineに移動すると、ループ実行の効果が得られます.
ZE実行中には、ZE実行時に必要な情報を格納する4つのグローバル変数があります.
//_zend_compiler_globals      ,      
zend_compiler_globals    *compiler_globals;  
//_zend_executor_globals      
zend_executor_globals    *executor_globals; 
//_php_core_globals     php.ini    
php_core_globals         *core_globals; 
//_sapi_globals_struct SAPI   
sapi_globals_struct      *sapi_globals;

実行中、変数名およびポインタは主に_に格納されます.zend_executor_globalsのシンボルテーブル、zend_executor_globalsの構造は次のとおりです.
struct _zend_executor_globals {
...
/* symbol table cache */
HashTable *symtable_cache[SYMTABLE_CACHE_SIZE];
HashTable **symtable_cache_limit;
HashTable **symtable_cache_ptr;

zend_op **opline_ptr;

HashTable *active_symbol_table;  /* active symbol table */
HashTable symbol_table;     /* main symbol table */

HashTable included_files;   /* files already included */
...
}

実行中、active_symbol_tableは、実行される特定の文に応じて変化します.スレッドに対して安全なEGマクロは、この変数の値を取得するために使用されます.ZE将op_Arrayの実行が完了すると、HashTableはFREE_HASHTABLE()をリリースします.プログラムがunset文を使用して変数をアクティブに破棄するとZEND_が呼び出されますUNSET_VAR_SPEC_CV_HANDLERは変数を破棄し、メモリを回収します.