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