PHP扩展中的对象有3个主要处理程序:create,destroy和free。
此处指定了“create”处理程序(请参阅注释“HERE”):
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
:
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之间的区别是:
create
和free
; create
,destroy
,free
create
并且内存确实泄漏。为什么HHVM(使用-m daemon
运行)不会调用free
?我怀疑它可以使用一些优化,在其他请求中重用已创建的对象,但是在数百万次请求后,对象不断创建。