PHP7 рдореЗрдВ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ "рд╣реИрд▓реЛ, рджреБрдирд┐рдпрд╛" рд╕реЗ рдЕрдзрд┐рдХ рдХрдард┐рди рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдП, рдФрд░ рд▓рд╛рд▓-рдЖрдВрдЦреЛрдВ рд╡рд╛рд▓рд╛ рдмрдирдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред рднрд╛рдЧ реи

рдкрд╣рд▓реЗ рднрд╛рдЧ рдХрд╛ рд╕рд╛рд░рд╛рдВрд╢


рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ, рдореИрдВрдиреЗ рдПрдХ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ рдЦрд╛рд▓реА рдХрд░ рджрд┐рдпрд╛, рдЗрд╕реЗ Clion IDE рдореЗрдВ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛, my_array_fill () рдХреЗ рдЕрдиреБрд░реВрдк рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрд╛, рдФрд░ php рдореЗрдВ рдЗрд╕рдХреА рд╕рдВрдЪрд╛рд▓рди рдХреНрд╖рдорддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХреАред

рдЕрдм рдХреНрдпрд╛


рдЕрдм рдореИрдВ libtrie рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛрдб рдХреЛ рд╣рдорд╛рд░реЗ рд╡рд┐рд╕реНрддрд╛рд░ рдореЗрдВ рдбрд╛рд▓рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВред

рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝реА рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдЖрдк php7 рдореЗрдВ рдкреБрд░рд╛рдиреЗ php5 рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреИрд╕реЗ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдореИрдВ php рдореЗрдВ рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рдХреБрдЫ рдмреБрдирд┐рдпрд╛рджреА рдХрд╛рд░реНрдп рдХрд░реВрдБрдЧрд╛ рдФрд░ рдЬрд╛рдБрдЪ рдХрд░реВрдБрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рд╣реБрдЖред

рдЪрд▓реЛ рдЪрд▓рддреЗ рд╣реИрдВ


рд╣рдорд╛рд░реЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдореЗрдВ рд▓рд┐рдмрд░реНрдЯреА рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ


рдореИрдВ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рдЬрд╛рддрд╛ рд╣реВрдВ

cd ~/Documents/libtrie/ 

рд▓рд┐рдмрд░реНрдЯреА рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рдХреНрд▓реЛрди рдХрд░рдирд╛

 git clone https://github.com/legale/libtrie 



рдореИрдВ рдлрд╛рдЗрд▓ рдХреЛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛрдб php_libtrie.c рд╕рд╛рде php_libtrie.c рдФрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛрдб libtrie/src/libtrie.c рд╕рд╛рде рдлрд╛рдЗрд▓ред



рдореИрдВ рдмрд╛рдж рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдирд╛рдо рдФрд░ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред

Php I рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдп рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рд╣реА рд╣реИрдВред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рд╣рдорд╛рд░реЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдХреЛрдб рдореЗрдВ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рд╣рдо php_libtrie.c рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:

 #include "libtrie/src/libtrie.h" 

Yatrie_new рдлрд╝рдВрдХреНрд╢рди


рдореИрдВ рдкрд╣рд▓рд╛ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рдЙрдкрд╕рд░реНрдЧ рд╡реГрдХреНрд╖ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдЧрд╛ред рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдЗрд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ

 trie_s *yatrie_new(uint32_t max_nodes, uint32_t max_refs, uint32_t max_deallocated_size) {...} 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдХреЛрдб рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдлрд╝рдВрдХреНрд╢рди рдЗрдирдкреБрдЯ рдкрд░ 3 рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рддрд░реНрдХ рд▓реЗрддрд╛ рд╣реИ рдФрд░ trie_s рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдПрдХ рд╕рдВрдХреЗрддрдХ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рд╕реАрдзреЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдХрд╣реЗрдВ, рдирд┐рд░реНрдорд┐рдд рдЙрдкрд╕рд░реНрдЧ рдкреЗрдбрд╝ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рджреЗрддрд╛ рд╣реИред

рд╣рдорд╛рд░реЗ рдЙрдкрд╕рд░реНрдЧ рд╡реГрдХреНрд╖ рдХреЛ PHP рдореЗрдВ рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, PHP рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╕рдВрд╕рд╛рдзрди рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИред рдЬрдм PHP рдореЗрдВ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

 fopen("filename.ext"); 

рд╕реА рднрд╛рд╖рд╛ рдореЗрдВ рдмреЛрд▓рддреЗ рд╣реБрдП, рдкреНрд░реЛрдЧреНрд░рд╛рдо рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реИ, рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдмрдирд╛рддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рд╕рдВрд╕рд╛рдзрди рдХреЗ рд░реВрдк рдореЗрдВ рд╣реИ рдФрд░ рдкреАрдПрдЪрдкреА рдХреЗ рдмрд╛рд╣рд░ рд▓реМрдЯрддрд╛ рд╣реИред

рд╣рдо рдЕрдкрдиреЗ рдкреЗрдбрд╝ рдХреЗ рд╕рд╛рде рднреА рдРрд╕рд╛ рд╣реА рдХрд░реЗрдВрдЧреЗред

рдЪрд▓реЛ php_libtrie.c рдореЗрдВ рдПрдХ рд╕рдорд╛рд░реЛрд╣ рдмрдирд╛рддреЗ рд╣реИрдВ:

рдлрд╝рдВрдХреНрд╢рди рдХреЛрдб
 PHP_FUNCTION (yatrie_new) { /*     */ trie_s *trie; //     zend_long max_nodes; // -      zend_long max_refs; /*  -   . *        . -  +25%     . * ,    OpenCorpora ~3.    5.   5.  */ zend_long max_deallocated_size; /*        *    .    96    , 1  ,  95. *              95,  , *  .         94. */ //   PHP if (zend_parse_parameters(ZEND_NUM_ARGS(), "lll", &max_nodes, &max_refs, &max_deallocated_size) == FAILURE) { RETURN_FALSE; } //             trie = yatrie_new((uint32_t)max_nodes, (uint32_t)max_refs, (uint32_t)max_deallocated_size); //   -   if (!trie) { RETURN_NULL(); } //  2  /*  zend_register_resource()     Zend, *        le_libtrie,   ZVAL_RES() *     zval return_value */ ZVAL_RES(return_value, zend_register_resource(trie, le_libtrie)); } 


рдЕрдм рдЖрдкрдХреЛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд░рдгреА рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдлрд╝рдВрдХреНрд╢рди PHP рд╕реЗ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрдЧрд╛ред

 PHP_FE(yatrie_new, NULL) 



рдЗрд╕реЗ рд╕реБрдВрджрд░ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдбрд┐рдХреНрд▓реЗрд░реЗрд╢рди рдЬреЛрдбрд╝ рджреВрдВрдЧрд╛ред рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ PHP рдлрд╝рдВрдХреНрд╢рди рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдЕрднреА рднреА рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рднреА рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рд┐рдд рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред

рдмрд╕ рд▓рд╛рдЗрдиреЗрдВ рдЬреЛрдбрд╝реЗрдВ:

 PHP_FUNCTION(confirm_libtrie_compiled); PHP_FUNCTION(my_array_fill); PHP_FUNCTION(yatrie_new); 
php_libtrie.h рдлрд╝рд╛рдЗрд▓ рдореЗрдВред рдХрд╣реАрдВ рднреА:
 #ifndef PHP_LIBTRIE_H #define PHP_LIBTRIE_H 
рдФрд░
 #endif /* PHP_LIBTRIE_H */ 



PHP рдиреЗ рд░рд┐рд╕реЛрд░реНрд╕ рдбрд┐рд╕реНрдЯреНрд░рдХреНрдЯрд░ рдмрдирд╛рдпрд╛


Yatrie_new () рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдПрдХ рдЯреНрд░реА рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдПрдХ PHP рд╕рдВрд╕рд╛рдзрди рдХреЛ рднреА рдкрдВрдЬреАрдХреГрдд рдХрд░рддрд╛ рд╣реИред рдЕрдм рд╣рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдмрдирд╛рдП рдЧрдП рд╕рдВрд╕рд╛рдзрди рдХреЛ рдмрдВрдж рдХрд░ рджреЗрдЧрд╛ рдФрд░ рдЙрдкрд╕рд░реНрдЧ рдкреЗрдбрд╝ рджреНрд╡рд╛рд░рд╛ рдХрдмреНрдЬрд╛ рдХреА рдЧрдИ рдореЗрдореЛрд░реА рдХреЛ рдореБрдХреНрдд рдХрд░ рджреЗрдЧрд╛ред

 /** * @brief  ,           * @param rsrc : zend_resource *  * @return void */ static void php_libtrie_dtor(zend_resource *rsrc TSRMLS_DC) { //     trie   trie_s *trie = (trie_s *) rsrc->ptr; //   ,   , //   trie yatrie_free(trie); } 

рдЪреВрдВрдХрд┐ рдлрд╝рдВрдХреНрд╢рди рд╡рд┐рд╕реНрддрд╛рд░ рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП рдЖрдВрддрд░рд┐рдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИред рдЙрд╕рдХреА рдШреЛрд╖рдгрд╛ рдХреЛ php_libtrie.h рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:



рдЕрдм рдЖрдкрдХреЛ PHP рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдмрд╕ рддреБрд░рдВрдд SUCCESS рд▓реМрдЯрд╛ред рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдХреЗ рдкрдВрдЬреАрдХрд░рдг рдХреЛ рд╡рд╣рд╛рдВ рдЬреЛрдбрд╝рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред

 //  PHP     trie PHP_MINIT_FUNCTION (libtrie) { le_libtrie = zend_register_list_destructors_ex( php_libtrie_dtor, NULL, PHP_LIBTRIE_RES_NAME, module_number); return SUCCESS; } 



рдмрдирд╛рдпрд╛ рдкреЗрдбрд╝ рд╕рдорд╛рд░реЛрд╣ рд╣рдЯрд╛ рджреЗрдВ


рдЬреИрд╕реЗ fopen() рдлрдВрдХреНрд╢рди рдореЗрдВ fopen() рдХрд╛ рдПрдХ рдЬреЛрдбрд╝рд╛ рд╣реЛрддрд╛ рд╣реИ, рд╡реИрд╕реЗ рд╣реА рдореЗрд░реЗ рдЯреНрд░реА рдХреНрд░рд┐рдПрд╢рди рдлрдВрдХреНрд╢рди рдореЗрдВ рдПрдХ рдЧрд░реНрд▓рдлреНрд░реЗрдВрдб рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдЬреЛ рдЗрд╕реЗ рдмреИрд▓реЗрдВрд╕ рдХрд░реЗред

рдХреЛрдб
 /** * @brief     * @param trie : resource * @return true/false : bool */ PHP_FUNCTION (yatrie_free) { zval *resource; //  zval    //    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &resource) == FAILURE) { RETURN_FALSE; } /*    ,    zend_resource, *      zval.     Z_RES_P() */ if (zend_list_close(Z_RES_P(resource)) == SUCCESS) { //  true  return_vale   return RETURN_TRUE; } //  false  return_vale   return RETURN_FALSE; } 


рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдлрд╝рдВрдХреНрд╢рди рдХреА рд╕рд░рдгреА рдореЗрдВ рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди рдЬреЛрдбрд╝реЗрдВ:

 PHP_FE(yatrie_free, NULL) 

рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рдгрд╛ рдЬреЛрдбрд╝реЗрдВ:

 PHP_FUNCTION(yatrie_free); 



рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдореИрдВрдиреЗ PHP рдореЗрдВ рд╕рдВрд╕рд╛рдзрди рдХрд╛ рдЖрдВрддрд░рд┐рдХ рдирд╛рдо рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рд╣реИ, рд╕рд╛рде рд╣реА PHP5 рдореИрдХреНрд░реЛрдЬрд╝, рдЬреЛ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ PHP7 рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдореИрдВ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдХреЛрдИ рдЙрдирдХреЗ рд╕рд╛рде рд░рд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ PHP7 рдореЗрдВ PHP5 рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

 #define PHP_LIBTRIE_VERSION "0.1.0" /* Replace with version number for your extension */ #define PHP_LIBTRIE_RES_NAME "libtrie data structure" /* PHP resource name */ //previously (php5) used MACROS #define ZEND_FETCH_RESOURCE(rsrc, rsrc_type, passed_id, default_id, resource_type_name, resource_type) \ (rsrc = (rsrc_type) zend_fetch_resource(Z_RES_P(*passed_id), resource_type_name, resource_type)) #define ZEND_REGISTER_RESOURCE(return_value, result, le_result) ZVAL_RES(return_value,zend_register_resource(result, le_result)) 

рд╕рдорд╛рд░реЛрд╣ trie рдореЗрдВ рд╢рдмреНрдж рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ


рдЕрдм рдЙрдкрд╕рд░реНрдЧ рд╡реГрдХреНрд╖ рдореЗрдВ рдПрдХ рд╢рдмреНрдж рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВред


  1. рдХреЛрдб
     /** * @brief   trie    node_id     * @param trie : resource * @param word : string * @return node_id : int */ PHP_FUNCTION (yatrie_add) { trie_s *trie; //   zval *resource; //  zval    unsigned char *word = NULL; //     size_t word_len; //  word uint32_t node_id; //id  ,   //  if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &resource, &word, &word_len) == FAILURE) { RETURN_FALSE } /*    PHP,  : * 1    PHP ( zval,   ), * 2    *         * 3   id ,       *     void *,        trie_s * *  PHP5      ZEND_FETCH_RESOURCE(),  -    PHP7. */ trie = (trie_s *) zend_fetch_resource(Z_RES_P(resource), PHP_LIBTRIE_RES_NAME, le_libtrie); /*    trie *   -      *   - id     ,      *   -    . */ node_id = yatrie_add(word, 0, trie); //   RETURN_LONG(node_id); } 


  2. рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕рд░рдгреА рдореЗрдВ рдПрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдЬреЛрдбрд╝реЗрдВ:

     PHP_FE(yatrie_add, NULL) 
  3. рд╢реАрд░реНрд╖ рд▓реЗрдЦ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдХ рдШреЛрд╖рдгрд╛ рдЬреЛрдбрд╝реЗрдВ:

     PHP_FUNCTION(yatrie_add) 

рд╢рдмреНрджрдХреЛрд╢ рд╕реЗ рд╕рднреА рд╢рдмреНрджреЛрдВ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рд░реЛрд╣


рдЕрдм рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рдЙрдкрд╕рд░реНрдЧ рдкреЗрдбрд╝ рд╕реЗ рд╕рднреА рд╢рдмреНрджреЛрдВ рдХрд╛ рдЪрдпрди рдХрд░реЗрдЧрд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ PHP рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рдХрд░реЗрдЧрд╛ред


  1. рдХреЛрдб
     /** * @brief    ,    ,      * ,     * @param trie : resource * @param node_id : int * @param head () : string ,   *       * @return array */ PHP_FUNCTION (node_traverse) { trie_s *trie; //  trie words_s *words; //     trie zval * resource; //  zval  zend_long node_id; //  unsigned char *head = NULL; //    size_t head_len; //  //   PHP if (zend_parse_parameters(ZEND_NUM_ARGS(), "rl|s", &resource, &node_id, &head, &head_len) == FAILURE) { RETURN_NULL(); // null    } //     trie = (trie_s *) zend_fetch_resource(Z_RES_P(resource), PHP_LIBTRIE_RES_NAME, le_libtrie); //    trie  node_traverse()    words_s //    words = (words_s *) calloc(1, sizeof(words_s)); words->counter = 0; //    0 //  1     string_s *head_libtrie = calloc(1, sizeof(string_s)); // head  if(head != NULL) { head_libtrie->length = (uint32_t)head_len; //  memcpy(&head_libtrie->letters, head, head_len); //   head_libtrie } //    trie node_traverse(words, (uint32_t) node_id, head_libtrie, trie); //  PHP ,       words array_init_size(return_value, words->counter); //    php while (words->counter--) { //  trie     ,    //     uint8_t dst[256]; //   libtrie decode_string(dst, words->words[words->counter]); //  Zend API,        php string    char * add_next_index_string(return_value, (const char *) dst); } //      words  head_libtrie free(words); free(head_libtrie); } 

  2. рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕рд░рдгреА рдореЗрдВ рдПрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдЬреЛрдбрд╝реЗрдВ:

     PHP_FE(node_traverse, NULL) 

  3. рд╢реАрд░реНрд╖ рд▓реЗрдЦ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдХ рдШреЛрд╖рдгрд╛ рдЬреЛрдбрд╝реЗрдВ:

     PHP_FUNCTION(node_traverse) 


рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рдзрд╛рдирд╕рднрд╛


рдЪреВрдВрдХрд┐ рдЕрдм рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдерд░реНрдб-рдкрд╛рд░реНрдЯреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рднреА рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореИрдВ config.m4 рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓реЗрдВ рдФрд░ рд╡рд╣рд╛рдБ 2 libtrie рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓реЗрдВ рдЬреЛрдбрд╝реЗрдВ:

libtrie/src/libtrie.c
libtrie/src/single_list.c


рдпрд╣рд╛рдВ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдмрд╛рдж рдлрд╝рд╛рдЗрд▓ рдХреА рдкреВрд░реА рд╕рд╛рдордЧреНрд░реА рд╣реИред

config.m4
 PHP_ARG_ENABLE(libtrie, whether to enable libtrie support, [ --enable-libtrie Enable libtrie support]) if test "$PHP_LIBTRIE" != "no"; then #    -    # PHP_ADD_INCLUDE(libtrie/src/) #   PHP_NEW_EXTENSION(libtrie, \ libtrie/src/libtrie.c \ libtrie/src/single_list.c \ php_libtrie.c \ , $ext_shared) # PHP_NEW_EXTENSION(libtrie, php_libtrie.c libtrie/src/libtrie.c libtrie/src/single_list.c, $ext_shared,, -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1) fi 




рдЕрдм рдЖрдкрдХреЛ ./configure рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдлрд┐рд░ рд╕реЗ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдореИрдВ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреА рдореВрд▓ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕реЗ рдЪрд▓рд╛рддрд╛ рд╣реВрдВ:

 phpize && ./configure 

рдЕрдм рдореИрдВ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд░рд╣рд╛ рд╣реВрдВ:

 make 

рдкрд░реАрдХреНрд╖рдг


рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдПрдХ php рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ рддрд╛рдХрд┐ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдЬреНрдпрд╛рджрд╛ рди рд▓рд┐рдЦреЗрдВред рдореИрдВ рдпрд╣ рдХрд░реВрдВрдЧрд╛:

 nano yatrie_test.php 

рдФрд░ рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рд╣реИ:

 <?php echo "C   500   500 \n\n"; $trie = yatrie_new(500, 500, 100); echo "!\n  ,  id    \$nodes\n"; $nodes[] = yatrie_add($trie, ""); $nodes[] = yatrie_add($trie, ""); $nodes[] = yatrie_add($trie, ""); echo "     .\n    2 ,    2.\n    3 ,  2     ,\n   1  \n"; print_r($nodes); print_r(node_traverse($trie, 0)); yatrie_free($trie); 

рд╣рдо рдХрдВрд╕реЛрд▓ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

 php -d extension=modules/libtrie.so yatrie_test.php 

рдпрд╣рд╛рдБ рдЖрдкрдХреЛ рдХреНрдпрд╛ рдорд┐рд▓рдирд╛ рдЪрд╛рд╣рд┐рдП:



рд╣рдо рдпрд╣рд╛рдВ рд╕реЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рд╕реЛрд░реНрд╕ рдХреЛрдб рд▓реЗрддреЗ рд╣реИрдВ ред рд╢рд░реНрдореАрд▓реА рдордд рдмрдиреЛ рдФрд░ рддрд╛рд░рд╛рдВрдХрди рдХрд░реЗрдВ :-)

Source: https://habr.com/ru/post/hi428732/


All Articles