ç«ã®äžã«ã¯ãããŸããŸãªãœãŒã¹ïŒã»ãšãã©ãè±èªïŒããå ¥æããC ++ã䜿çšããŠPHPã®æ¡åŒµæ©èœãäœæããèªåã®ããŒãºã«åãããŠ1ã€ã®ã¢ãžã¥ãŒã«ãéçºããªããZend Engine 2ã®ãœãŒã¹ãéžæããæ å ±ãããã€ãèšèŒãããŠããŸãã ãã®ããªã¥ãŒã ãååã«å€§ããã®ã§ãç°¡æœã«ããããšããŸããã
ãã®éšåã§ã¯ïŒ
ãããããã®éšåã§ã¯C ++ã«ã¯å°éããŸãã... =ïŒ
å°ããªå 責äºé ïŒèšäºã®å 容ã¯ãæåã¯çå®ã§ã¯ãªããå ¬åŒææžã«åºã¥ããŠããããã§ã¯ãããŸããïŒããã¯ãããŸããïŒïŒãããŠãZE 2ã«å¯Ÿãã䞻芳çãªèŠè§£ã§ããããŸããéçºã®åæ段éã§æéãç¯çŽããããã
Zend Engine 2ã®å éšäžç
åºæ¬çãªããŒã¿å
Zend Engine 2ã¯Cã§èšè¿°ãããŠããŸããããã¯ãå éšãšã³ã·ã¹ãã ã«å€§ããªåœ±é¿ãäžããŠããŸãã ã¯ã©ã¹ãªããžã§ã¯ãã®ãã©ãã€ã ãååšããªãå Žåãã°ããŒãã«å€æ°ãèªç±é¢æ°ãããã³ãŠãŒã¶ãŒå®çŸ©ããŒã¿åïŒæ§é äœïŒãšã®é¡äŒŒæ§ãZE 2å ã«çºçããŸããã ãã¹ãŠã®å Žåã«ãããŠãåçŽããŒã¿åãšè€åããŒã¿åã®çµã¿åãããããã³ããããåŠçããããã®æé ããããŸãã
æãäžè¬çãªæ§é ã¯zval ïŒzend-valueïŒïŒã§ãã æ§é ã¯ã ãŠãŒã¶ãŒã¹ããŒã¹ã®è£åŽã®PHPå€æ°ã®è¡šçŸã§ãïŒããããã³ä»åŸããŠãŒã¶ãŒã¹ããŒã¹ã¯PHPã§èšè¿°ãããã³ãŒããæå³ããZEãåŠçããããã ãŠãŒã¶ãŒã¹ããŒã¹ã®è£åŽã¯Cã³ãŒãã§ãïŒã
PHPã¯ã匱ãåçåä»ããšèªåã¡ã¢ãªç®¡çãåããèšèªã§ãããã®èšèªã®å€æ°ã¯ãã©ã€ããµã€ã¯ã«å šäœã§åãå€æŽã§ããå¿ èŠããªããªã£ãåŸã«ããã°ã©ããæ瀺çã«åé€ããå¿ èŠã¯ãããŸããïŒã¬ããŒãžã³ã¬ã¯ã¿ããããåŠçããŸãïŒã ãããã®æ°ãŸããã«ã€ããŠã¯ãéšåçã«èšããŸããŠzvalããå¿ èŠããããŸãã çŸåšïŒ PHP 5.3.3 ïŒãã®æ§é ã¯æ¬¡ã®ããã«å®çŸ©ãããŠããŸãïŒzend.hïŒïŒ
typedef struct _zval_struct zval; struct _zval_struct { /* Variable information */ zvalue_value value; /* value */ zend_uint refcount__gc; zend_uchar type; /* active type */ zend_uchar is_ref__gc; };
ããã§äœãèŠããŸããïŒ é©ãã¹ãããšã«ãZendå€ïŒzvalïŒã¯çŽæ¥å€æ°ã®å€ã§ã¯ãããŸããã å€æ°ã®å€ã¯å€ãã£ãŒã«ãã«æ ŒçŽããããã®ã¿ã€ãã¯zvalue_value ïŒäžïŒã§ãã valueã«æ ŒçŽãããå€ã®ã¿ã€ãã¯ãã¿ã€ããã£ãŒã«ãã«ãã£ãŠæ±ºå®ããã次ã®ããããïŒzend.hïŒã«ãªããŸãã
#define IS_NULL 0 #define IS_LONG 1 #define IS_DOUBLE 2 #define IS_BOOL 3 #define IS_ARRAY 4 #define IS_OBJECT 5 #define IS_STRING 6 #define IS_RESOURCE 7 #define IS_CONSTANT 8 #define IS_CONSTANT_ARRAY 9
ãããããã«ãããŸã-ãããã¯éåžžã«8çš®é¡ã®PHPããŒã¿ã§ãå€ãã®å Žåã人ã ã¯ã€ã³ã¿ãã¥ãŒã«ãªã¹ãã§ããŸããïŒ ããã«ã2ã€ã®åå¥ã®å€ãIS_CONSTANTããã³IS_CONSTANT_ARRAYã
æ§é ã«ã¯ããã®å€æ°ãžã®åç §ã®æ°ã«é¢ããæ å ±ïŒrefcount__gcïŒãšããã®å€æ°ãåç §ã§ãããã©ããã決å®ãããã©ã°ïŒis_ref__gcïŒãå«ãŸããŸãã ãã®æ å ±ã¯ãZEå ã®ã¡ã¢ãªã䜿çšããŠå¹æçãªäœæ¥ãæŽçããããã«å¿ èŠã§ãã ããšãã°ããŠãŒã¶ãŒç©ºéã§ã®æ¬¡ã®ç¶æ³ïŒ
<?php $foo = 5; // 1 $bar = $foo; // 2
ã¿ã€ãIS_LONGã®zval valãªããžã§ã¯ãã®äœæïŒãŠãŒã¶ãŒç©ºéã®ãã¹ãŠã®æŽæ°ã¯ãŠãŒã¶ãŒç©ºéã®å察åŽã®C longã«å¯Ÿå¿ïŒãäœæãããã®is_ref_gcã0ã«ãrefcount_gcã1ïŒæåã®è¡ïŒã«èšå®ããæåãfooã valïŒãå€ãšããŠæã€çŸåšã®ããã»ã¹æåããŒãã«ïŒå®éã«ã¯å€æ°åãšãã®å€ã®é£æ³é åïŒ 2è¡ç®ã§ã¯ãzvalã®æ°ããã€ã³ã¹ã¿ã³ã¹ã¯äœæãããŸããã ã·ã³ãã«ããŒãã«ã«è¿œå ãããã°ããã®Valã¯1åç §ã«ãŠã³ãå¢å ããããŒã·ã³ãã«ã¯åãvalã§ã·ã³ãã«ããŒãã«ã«ç»é²ãããŸãã ããã«ãããæ°ããå€æ°ãäœæããããã«å¿ èŠãªã¡ã¢ãªå²ãåœãŠã®æ°ãåæžãããŸãã
ã€ã³ã¿ãŒããªã¿ãŒãã³ãŒãã«ééãããšïŒ
... $bar = '42';
圌ã¯ãã·ã³ãã«ãbarãã«å¯Ÿå¿ããããã»ã¹zvalã®æåã®çŸåšã®ããŒãã«ããæœåºãããŸãããã®å€ãžã®ãªã³ã¯ã®æ°ããã§ãã¯ããŸãã ããã1ãã倧ãããzvalãåç §ïŒis_ref_gc == 0ïŒã§ãªãå Žåãã€ã³ã¿ãŒããªã¿ãŒã¯$ barã®çŸåšã®å€ã®ã³ããŒãäœæããããã§ã¢ã¯ã·ã§ã³ãå®è¡ãïŒãã®å Žåãæååå€ã '42'ãšåçã«ããŸãïŒãã·ã³ãã«ããŒãã«ã«ãbarããå ¥ããŸãæ°ãã䟡å€ã refcoun_gc == 1ãŸãã¯is_ref_gc == 1ã®å Žåãã¢ã¯ã·ã§ã³ã¯ã·ã³ãã«ããŒãã«ããååŸããå€ã«å¯ŸããŠçŽæ¥å®è¡ãããŸãã ãããã£ãŠã次ã®ãããªç¶æ³ïŒããã人çºçã§ããããçåœã«å¯Ÿããæš©å©ãããïŒã®ç¶æ³ã§ã¯ïŒ
<?php $foo = 100500; //1 $bar = $foo; //2 echo $bar; unset($bar); $foo = '42'; //3
ã€ã³ã¿ãŒããªã¿ãŒã®ã³ã¹ãã¯zvalã1ã€ã ãã§ãããããã«å¯Ÿå¿ãã2æåã§ãã ããã¯ãã³ã¡ã³ã1ã®è¡ã§zval valã1ã«çãããªã³ã¯ã®æ°ã§äœæãããããå¯èœã§ããã³ã¡ã³ã2ã®è¡ã§ã¯ãå€valã®æ°ããã·ã³ãã«ãããŒããç»é²ãããŸãããã®ãããrefcoun_gcã¯ãã§ã«2ã«çããã³ã¡ã³ã3ã§ã¯ãunsetïŒ$ barïŒãåŒã³åºããåŸãvalãžã®ãªã³ã¯ã®æ°ãåã³1ã«æžå°ãããããæ°ããzvalã¯äœæãããŸããã
ãŠãŒã¶ãŒç©ºéã§$ b =ïŒ$ aã®åœ¢åŒã®æ§é ãæ€åºãããå Žåãis_ref_gcã1ã«çãããªããšæšæž¬ããããšã¯é£ãããããŸããã
äžèšã®ã¢ãããŒãã¯ããæžã蟌ã¿æã«åé¢ããšåŒã°ããŸãã
次ã«ãã¿ã€ããèŠãŠã¿ãŸããã zvalue_valueïŒzend.hïŒïŒ
typedef union _zvalue_value { long lval; /* long value */ double dval; /* double value */ struct { char *val; int len; } str; HashTable *ht; /* hash table value */ zend_object_value obj; } zvalue_value;
ãããçµåã§ããããšã«æ°ä»ãã®ã¯é£ãããªãã ããã¯ãzvalue_valueåã®å€æ°ã®ã¢ãã¬ã¹ã®ã¡ã¢ãªã«ããããŒã¿ã¯ãéçºæ®µéãšå®è¡æ®µéã®äž¡æ¹ã§ããŠããªã³ãæ§æããããŒã¿åã®ãããããšããŠããã°ã©ããŒã«ãšã£ãŠäŸ¿å©ãªæ¹æ³ã§è§£éã§ããããšãæå³ããŸãã ãã®zvalue_valueã®æ©èœã«ãããPHPãŠãŒã¶ãŒç©ºéå€æ°ã®ã¿ã€ããäžçç°¡åã«å€æŽã§ããããã«ãªããŸãïŒzvalå€æ°ã®çŸåšã®ã¿ã€ãã¯ããã®ã¿ã€ããã£ãŒã«ããåç §ããããšã§èŠã€ããããšãã§ããŸãïŒã
ãã ããããã«ã¯5ã€ã®äžæã®ãã£ãŒã«ããšããŒã¿å8ã®ã¿ã衚瀺ãããŠãããšèšããŸããPHPåã®zvalue_valueãŠããªã³ãžã®ãããã³ã°ã¯æ¬¡ã®ãšããã§ãã
- long lval-æŽæ°ïŒæŽæ°ïŒãããŒã«ïŒããŒã«ïŒããã³ãªãœãŒã¹ïŒãªãœãŒã¹ïŒ
- double dval-ããã§ã¯æ確ã§ãïŒdoubleïŒ
- struct ... str-PHPæååïŒæååïŒ
- HashTable * ht-é åïŒé åïŒ
- zend_object_value obj-PHPãªããžã§ã¯ãïŒãªããžã§ã¯ãïŒ-SPLãšã«ã¹ã¿ã ã®äž¡æ¹ã
- null-å€ã«ã¯å€ããããŸããïŒzval.type == IS_NULLïŒã
zvalue_valueã®æ§é ãæ€èšããããšããäœã圹ç«ã€ã§ããããïŒ
- ãªãœãŒã¹ã¿ã€ãã¯æŽæ°ã®èå¥åã§ã®ã¿è¡šãããããããŠãŒã¶ãŒã¹ããŒã¹ã§ã¯ããŒã¯ããŒã¹ã®ããã«èŠããŸãã ãŠãŒã¶ãŒç©ºéã®å察åŽã§ã¯ããã®ãããªèå¥åãéããŠãããã¡ã€ã«èšè¿°åãTCPãœã±ãããããŒã¿ããŒã¹æ¥ç¶ãªããžã§ã¯ããªã©ã«é¢é£ä»ããããšãã§ããŸãã ãããã³ã°ã¯ããªãœãŒã¹ã®ç¹å¥ãªã¹ãã¬ãŒãžãä»ããŠè¡ãããŸãïŒãã¡ãããCåŽïŒã
- PHPã®å®éã®ãã®ã¯ãã¹ãŠå粟床ã§ã8ãã€ããå æããŸãã
- ååãšããŠãæååã¯ãã€ããªã»ãŒãã«ããããšãã§ããŸãã å éšã§ãã«æåã䜿çšããŸãã ããã¯ãæååã®é·ããããã®æååã眮ãããŠããã¡ã¢ãªãžã®ãã€ã³ã¿ãšãšãã«æ ŒçŽããããšããäºå®ã«ããå®çŸãããŸãã strlenæäœã¯ãŠãŒã¶ãŒç©ºéã§é«éã§ãã è¡æ«ã®ãã«æåã¯ãªãã·ã§ã³ã§ãã å®éãå€ãã®æ¡åŒµæ©èœã¯æ£ç¢ºã«nullã§çµäºããæååã䜿çšããæååstrlenã軜èŠããŸããã
- é åã¯ãå éšHashTableåã§è¡šãããŸãã HashTableã¯å¥ã®æ§é ã§ããããããæ€èšãããããæäœããååã¯ãã®èšäºã®ç¯å²å€ã§ãã
- PHPã®ãªããžã§ã¯ãã¯ã zend_object_valueæ§é ã§è¡šãããŸãã æ¡åŒµæ©èœã®éçºã¯ãç¬èªã®ããŒã¿åã®äœæãšé¢é£ããŠãããããåŸã§èª¬æããŸãã
- PHPã§å€æ°ãäœæãããšãå€æ°ã®ã¿ã€ãã«é¢ä¿ãªãã32ãããã¢ãŒããã¯ãã£ã§å°ãªããšã16ãã€ããæ¶è²»ãããŸãïŒãŠããªã³ã®ãµã€ãºããã®äžã®ãã£ãŒã«ãã®æ倧ãµã€ãºã«çããå Žåãzvalãã£ãŒã«ãã®ãµã€ãºãåèšããŸãïŒã
ããã§ãªããžã§ã¯ãã«å°éããŸããã zend_object_valueæ§é äœã¯ããªããžã§ã¯ããå«ããŠãŒã¶ãŒç©ºéå€æ°ãè¡šãããšãç®çãšããŠããŸãã ãããŠãã¯ã©ã¹ãªããžã§ã¯ããã©ãã€ã ã®ãªããžã§ã¯ããšã¯äœã§ããïŒ ãªããžã§ã¯ããšã¯ãããŒã¿ãšãã®åŠçæ¹æ³ã®å ±çã§ãã ããã§ã¯ãæ§é ãèŠãŠã¿ãŸããã zend_object_value ïŒzend_type.hïŒïŒ
typedef unsigned int zend_object_handle; typedef struct _zend_object_handlers zend_object_handlers; typedef struct _zend_object_value { zend_object_handle handle; zend_object_handlers *handlers; } zend_object_value;
æ§é ã¯ãæŽæ°èå¥åïŒãã³ãã«ïŒãšå¥ã®æ§é ïŒzend_object_handlers *ãã³ãã©ãŒïŒã®çµã¿åããã§ããããªããžã§ã¯ãã«é¢é£ä»ããããç¹å®ã®ã€ãã³ããçºçãããšãã«ZE 2ãšã³ãžã³ã«ãã£ãŠåŒã³åºãããé¢æ°ãžã®ãã€ã³ã¿ãŒãå«ãŸããŸãã ãã®ãããªã€ãã³ãã«ã¯ãæ°ããå€æ°ããªããžã§ã¯ããå«ãå€æ°ã®å€ãšåçã«ããïŒzend_object_add_ref_t add_refïŒãã¹ã³ãŒãããåºããå¥ã®å€ã§åæåããããŸãã¯ãªããžã§ã¯ããå«ãå€æ°ã®èšå®è§£é€ãåŒã³åºãïŒzend_object_del_ref_t del_refïŒã__ cloneïŒzend_object_cloneãåŒã³åºãããšã«ãããªããžã§ã¯ããè€è£œããïŒãå«ãŸããŸãclone_objïŒããªããžã§ã¯ãããããã£ãžã®ã¢ã¯ã»ã¹ïŒzend_object_read_property_t read_propertyïŒããªããžã§ã¯ãããããã£ãžã®æžã蟌ã¿ïŒzend_object_write_property_t write_propertyïŒãªã© zend_object_handlersæ§é äœèªäœã¯æ¬¡ã®ãšããã§ãïŒzend_object_handlers.hïŒïŒ
struct _zend_object_handlers { /* general object functions */ zend_object_add_ref_t add_ref; zend_object_del_ref_t del_ref; zend_object_clone_obj_t clone_obj; /* individual object functions */ zend_object_read_property_t read_property; zend_object_write_property_t write_property; zend_object_read_dimension_t read_dimension; zend_object_write_dimension_t write_dimension; zend_object_get_property_ptr_ptr_t get_property_ptr_ptr; zend_object_get_t get; zend_object_set_t set; zend_object_has_property_t has_property; zend_object_unset_property_t unset_property; zend_object_has_dimension_t has_dimension; zend_object_unset_dimension_t unset_dimension; zend_object_get_properties_t get_properties; zend_object_get_method_t get_method; zend_object_call_method_t call_method; zend_object_get_constructor_t get_constructor; zend_object_get_class_entry_t get_class_entry; zend_object_get_class_name_t get_class_name; zend_object_compare_t compare_objects; zend_object_cast_t cast_object; zend_object_count_elements_t count_elements; zend_object_get_debug_info_t get_debug_info; zend_object_get_closure_t get_closure; };
ãããŠã ããã§è©³çŽ°ãèªãã§ãã ãã ã
æ°ãåãããŠãzend_object_valueã«æ»ããŸãã ããã§ãã€ãã³ãã®é¢æ°ãã³ãã©ãžã®ãã€ã³ã¿ä»¥å€ã«äœãå«ãŸããŠããŸããïŒ ããããäœãïŒ _zend_object_handlerså ã®ãªããžã§ã¯ãã®åäœã決å®ããããšããè©Šã¿ã®é¡äŒŒæ§ãèŠãå Žåãäœããã®å¥åŠãªèå¥åïŒãã³ãã«ïŒã«å ããŠãç¹å®ã®ã€ã³ã¹ã¿ã³ã¹ã«åºæã®ããŒã¿ã¯èŠ³å¯ãããŸããã ããããèå¥åèªäœïŒç空äžã®çäœïŒã¯æå³ããããŸããã ãããã£ãŠãåçš®ã®ãšã³ãã£ãã£ã®äœããã®çš®é¡ã®ãªããžããªãååšããå¿ èŠããããŸãããã®èå¥åã¯ããããšã³ãã£ãã£ãå¥ã®ãšã³ãã£ãã£ããåºå¥ããŸãã
ZEã®ãã®ãããªã¹ãã¬ãŒãžã¯Zend Object Storageã§ãã ãã®äžã®ããŒã¯ãªããžã§ã¯ãèšè¿°åïŒzend_object_value.handleïŒãšå€ã§ã...ã¯ããã¯ããããããããªãã¯ãããæšæž¬ããŸãã-å¥ã®çš®é¡ã®æ§é ã¯zend_object ïŒzend.hïŒã§ãïŒ
typedef struct _zend_object { zend_class_entry *ce; HashTable *properties; HashTable *guards; /* protects from __get/__set ... recursion */ } zend_object;
ããã§ã¯ãå¥ã ã®ããŒã¹ããã
ãã®ãããçŸæç¹ã§ã¯ãªããžã§ã¯ããæäœããããã®æ¬¡ã®ãªãã·ã§ã³ããããŸã-ç¹å®ã®ç¶æ³ã§ãªããžã§ã¯ãã®æšæºåäœãåå®çŸ©ã§ãïŒzend_object_handlersã®å¯Ÿå¿ããé¢æ°ããªãŒããŒã©ã€ãããããšã«ããïŒãHashTable *ã«é¢é£ä»ããããããããã£ãã€ã³ã¹ã¿ã³ã¹ãã£ãŒã«ãã«æžã蟌ãããšã§ããŒã¿ãæ ŒçŽã§ããŸãçŸåšã®ãªããžã§ã¯ãã äœããæ¬ ããŠããŸã...ãããããã§ãããã©ã®ããã«ãªããžã§ã¯ãã«ã«ã¹ã¿ã åäœãè¿œå ããŸããïŒæ°ããã¡ãœãããäœæããŸãïŒïŒ ã¡ãœããã¯1ã€ã®ã¯ã©ã¹ã®ãã¹ãŠã®ãªããžã§ã¯ãã«å ±éãããã®ã§ãããããã¯ã©ã¹ã®ãã¹ãŠã®ãªããžã§ã¯ãã«å¯Ÿããå ±æã¢ã¯ã»ã¹ãžã®å ±æã¢ã¯ã»ã¹ãäœããã®æ§é ã«é 眮ããããšã¯è«ççã§ãã ãã®ãããªæ§é ã¯ã zend_class_entry ïŒzend.hïŒã§ãã
struct _zend_class_entry { char type; char *name; zend_uint name_length; struct _zend_class_entry *parent; int refcount; zend_bool constants_updated; zend_uint ce_flags; HashTable function_table; HashTable default_properties; HashTable properties_info; HashTable default_static_members; HashTable *static_members; HashTable constants_table; const struct _zend_function_entry *builtin_functions; // union _zend_function *constructor; //, union _zend_function *destructor; // union _zend_function *clone; union _zend_function *__get; union _zend_function *__set; union _zend_function *__unset; union _zend_function *__isset; union _zend_function *__call; union _zend_function *__callstatic; union _zend_function *__tostring; union _zend_function *serialize_func; union _zend_function *unserialize_func; zend_class_iterator_funcs iterator_funcs; /* handlers */ zend_object_value (*create_object)(zend_class_entry *class_type TSRMLS_DC); zend_object_iterator *(*get_iterator)(zend_class_entry *ce, zval *object, int by_ref TSRMLS_DC); int (*interface_gets_implemented)(zend_class_entry *iface, zend_class_entry *class_type TSRMLS_DC); /* a class implements this interface */ union _zend_function *(*get_static_method)(zend_class_entry *ce, char* method, int method_len TSRMLS_DC); /* serializer callbacks */ int (*serialize)(zval *object, unsigned char **buffer, zend_uint *buf_len, zend_serialize_data *data TSRMLS_DC); int (*unserialize)(zval **object, zend_class_entry *ce, const unsigned char *buf, zend_uint buf_len, zend_unserialize_data *data TSRMLS_DC); zend_class_entry **interfaces; zend_uint num_interfaces; char *filename; zend_uint line_start; zend_uint line_end; char *doc_comment; zend_uint doc_comment_len; struct _zend_module_entry *module; };
zend_class_entryæ§é äœã®ç®çã¯ãåãã¯ã©ã¹ã®ãã¹ãŠã®ãªããžã§ã¯ãã®äžè¬çãªåŽé¢ãè¡šãããšã§ãã zend_class_entryã¯ãå®éã«ã¯ã¯ã©ã¹ãã®ãã®ã§ãã ã芧ã®ãšãããæ§é ã¯å°ãããªããåãã£ãŒã«ãã®ç®çãèæ ®ããããšã¯ãã®èšäºã®ã¿ã¹ã¯ã§ã¯ãããŸããã ã³ã¡ã³ãã§ããŒã¯ãããã£ãŒã«ãã«æ³šç®ããŸãããã
const struct _zend_function_entry * builtin_functions-_zend_function_entryæ§é ã®é åãžã®ãã€ã³ã¿ãŒã ããããå°æ¥ã®ã¯ã©ã¹ã®ã¡ãœããã§ãããšæšæž¬ããããšã¯é£ãããããŸããã const修食åã§ããŒã¯ãããŠããããããã®é åã®èŠçŽ ãå€æŽããïŒã€ãŸããã€ã³ã¹ã¿ã³ã¹åãããã¯ã©ã¹ãªããžã§ã¯ãã®ã¡ãœããããªãŒããŒã©ã€ãããïŒããšã¯ã§ããŸããïŒzend_object_value.handlersãšã¯ç°ãªããŸãïŒã
ã³ã³ã¹ãã©ã¯ã¿ãŒããunserialize_funcãŸã§ã®ãã£ãŒã«ãã¯PHPã®ããžãã¯ã¡ãœããã§ã ïŒunserialize_funcã__wakeupã§ãããserialize_funcã__sleepã§ãããšæšæž¬ããã®ã¯é£ãããããŸãããæ®ãã®ã¡ãœãããåæ§ã®ããŒã¢ããã¯ãæã£ãŠããŸãïŒã
ç¬èªã®æ¡åŒµæ©èœãäœæããéçšã§ãbuiltin_functionsã«ãšã³ããªãè¿œå ããããå°æ¥ã®ã¯ã©ã¹ã®ããžãã¯ã¡ãœãããåå®çŸ©ãããã§ããŸãã
æåŸã«ãªããŸãããããã®ZEæ§é ã®é åçãªäžçãžã®é 足ã®ããŒããŒã¯ãæ¡åŒµã¢ãžã¥ãŒã«èªäœã®è¡šçŸã«é¢äžããæ§é ã§ã-zend_module_entry ïŒzend_modules.hïŒïŒ
struct _zend_module_entry { unsigned short size; unsigned int zend_api; unsigned char zend_debug; unsigned char zts; const struct _zend_ini_entry *ini_entry; const struct _zend_module_dep *deps; const char *name; const struct _zend_function_entry *functions; int (*module_startup_func)(INIT_FUNC_ARGS); int (*module_shutdown_func)(SHUTDOWN_FUNC_ARGS); int (*request_startup_func)(INIT_FUNC_ARGS); int (*request_shutdown_func)(SHUTDOWN_FUNC_ARGS); void (*info_func)(ZEND_MODULE_INFO_FUNC_ARGS); const char *version; size_t globals_size; #ifdef ZTS ts_rsrc_id* globals_id_ptr; #else void* globals_ptr; #endif void (*globals_ctor)(void *global TSRMLS_DC); void (*globals_dtor)(void *global TSRMLS_DC); int (*post_deactivate_func)(void); int module_started; unsigned char type; void *handle; int module_number; char *build_id; };
äžè¬çãªå Žåãæ¡åŒµæ©èœã¯1ã€ã§ã¯ãªãè€æ°ã®ã¯ã©ã¹ãåæã«å®è£ ã§ããŸã-ãšã¯ã¹ããŒãé¢æ°ã®ã¿ïŒã©ã€ãã¯OOPã«åæããŸããã§ããïŒãäžèšã®æ§é ã®èšèšã«ã©ã®ããã«åœ±é¿ããããèæ ®ããŠãã ããïŒ
- const struct _zend_function_entry * functions-æ¡åŒµæ©èœã«ãã£ãŠãšã¯ã¹ããŒããããé¢æ°ã®é åãžã®ãã€ã³ã¿ãŒã zend_class_entry.builtin_functionsãšåæ§ã§ãã
- intïŒ* module_startup_funcïŒïŒINIT_FUNC_ARGSïŒ-æ¡åŒµæ©èœãæ¥ç¶ããããšãã«åŒã³åºãããé¢æ°ãžã®ãã€ã³ã¿ãŒã ç¹ã«ãæ¡åŒµæ©èœãã¯ã©ã¹ããšã¯ã¹ããŒãããå Žåããã®é¢æ°ã§ã¯ã©ã¹ãZE 2ã®å éšã¯ã©ã¹ã¬ãžã¹ããªã«ç»é²ããå¿ èŠããããŸãã
- intïŒ* module_shutdown_funcïŒïŒSHUTDOWN_FUNC_ARGSïŒ-æ¡åŒµæ©èœãã¢ã³ããŒãããããšãã«åŒã³åºãããé¢æ°ãžã®ãã€ã³ã¿ãŒã ããã§èªåèªèº«ãæããªããã°ãªããŸããã
ããŒã¿åã®éå±€
åã®æ®µèœã§ã¯ãéåžžã®zvalããäžè¬çãªzend_module_entryãžã®ãã¹ã調ã¹ãŸããã ãããã®åãå·§ã¿ã«åŠçããŠãç¬èªã®PHPæ¡åŒµæ©èœãäœæãããªããžã§ã¯ããçæããããã®é©åã«èª¿æŽããããã¡ã¯ããªãç·šæã§ããŸãã å®éãPHPæ¡åŒµã¢ãžã¥ãŒã«ã¯ãŠãŒã¶ãŒã¹ããŒã¹ã®ãã¬ãŒãã³ã°ã¹ã¯ãŒã«ã®ãããªãã®ã§ãã æåã«ãããããã«ãïŒPHP_MINIT_FUNCTIONãåŒã³åºãïŒããç¹å®ã®çŠç¹ãæã€äººæ掟é£äŒç€ŸãšããŠåŽåååŒæïŒPHP_MINIT_FUNCTIONã§ãšã¯ã¹ããŒããããã¯ã©ã¹ãŸãã¯é¢æ°ã宣èšïŒã«ç»é²ãã次ã«ãåŸæ¥å¡ïŒã¯ã©ã¹ã®æ°ããã€ã³ã¹ã¿ã³ã¹ïŒã®æåã®èŠæ±æã«ãæŠéæ©ãæºåãããµã€ã¯ã«ãéå§ããïŒäœæããïŒå¿ èŠããããŸããªããžã§ã¯ãïŒã æºåã¯ãäœæããããªããžã§ã¯ãã«ã¡ã¢ãªãå²ãåœãŠãç¹å®ã®ã€ãã³ããã³ãã©ãŒïŒzend_object_handlersïŒããã³ç¬èªã®ã¯ã©ã¹ïŒzend_class_entryïŒã«é¢é£ä»ããŸããããã«ã¯ãæªæ¥ã®ãªããžã§ã¯ãã®ã¡ãœãããå«ãŸããŸãã ãã®æºåã¯éåžžãé¢æ°extension_name_objects_newã«é 眮ããããã£ãŒã«ãzend_class_entry.create_objectã«é¢é£ä»ããããŸãã
æŠç¥çã«ãå±éæ§é ã¯æ¬¡ã®ããã«è¡šãããšãã§ããŸãã

ãŸããæ¡åŒµæ©èœã®ããŒã¿åã®éå±€ãããæ確ã«æ³åããããã«ã次ã®å³ã瀺ããŸãã

ãããã«
ãã®èšäºã«ã¯å€ãã®ããã¹ããšéåžžã«å°ãªãã³ãŒããå«ãŸããŠããŸããããZE 2ããŒã¿åã®äžçãžã®é 足ããªããã°ãç¹å®ã®é¢æ°ã®åŒã³åºãã®ç®çãç解ããããšããããšã¯éåžžã«å°é£ã§ãã 次ã®ããŒãã§ã¯ãPHPæ¡åŒµã¢ãžã¥ãŒã«ãäœæããããã«å¿ èŠãªæåã®æé ã«ã€ããŠèª¬æããŸããããã®åã«zvalã®æäœãšã¡ã¢ãªå²ãåœãŠã®ç®¡çã®ãããã¯ã«è§ŠããŸãã
PSèå³ã®ãã人ã®ããã®èšäºã®çŽ æŽãããéžæã¯ãã¡ãã§ãã