2016-05-19 28 views
0

PHP拡張モジュールのオブジェクトには、create、destroy、freeの3つのメインハンドラがあります。なぜHHVM(zend-compatモード)がオブジェクトのメモリを解放しないのですか?

PHP_MINIT_FUNCTION(test2) 
{ 
    zend_class_entry tmp_ce; 
    INIT_CLASS_ENTRY(tmp_ce, "Test", test_functions); 
    test_ce = zend_register_internal_class(&tmp_ce TSRMLS_CC); 

    test_ce->create_object = my_create_handler; // HERE 

    memcpy(&test_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); 
    return SUCCESS; 
} 

残り2件のハンドラがmy_create_handlerにassinedされています:

ハンドラがここに割り当てられている "作成"( "HERE" のコメントを参照)私が構築

zend_object_value my_create_handler(zend_class_entry *class_type TSRMLS_DC) 
{ 
    test_object *intern = emalloc(sizeof(test_object)); 
    memset(intern, 0, sizeof(test_object)); 

    zend_object_std_init(&intern->std, class_type TSRMLS_CC); 
    object_properties_init(&intern->std, class_type); 

    retval.handle = zend_objects_store_put(
     intern, 
     (zend_objects_store_dtor_t) my_destroy_handler,  // DESTROY 
     (zend_objects_free_object_storage_t) my_free_handler, // FREE 
     NULL TSRMLS_CC 
    ); 


    retval.handlers = &test_object_handlers; 
    return retval; 
} 

と私の拡張を実行しますPHP5、PHP7、HHVM(zend-compatモード)用。私のtest.phpでは、私は、

<?php 
    $o = new Test(); 
    $o->myMethod(); 
?> 

PHP5の違いを行う7とHHVMは次のとおりです。

  • PHP5はcreatefreeを呼び出します。
  • PHP7はcreatedestroyfree
  • HHVMはcreateを呼び出して、メモリがリークしない呼び出します。

HHVM(-m daemonと一緒に実行する)がfreeを呼び出さないのはなぜですか?私はそれがいくつかの最適化を使用することができ、他の要求で作成されたオブジェクトを再利用することができると考えています。

答えて

関連する問題