Currently object's destructors are called in the zend_deactivate function in main.c after the modules request_shutdown_func has been called (main.c - php_call_shutdown_functions(void); ) .
Since no code should be executed after module request shutdown unexpected behaviour might occur like the one descibed in bug#27555 affecting the session extension. Maybe somebody can take a look. ./regards Florian <?php // Short test which saves a session in the destructor class TestSession { public static $oSessionMap; public function __construct() { session_start(); if( empty($_SESSION['sessionObject']) ) { TestSession::$oSessionMap = array(); } else if ( ! is_array(TestSession::$oSessionMap) ) { TestSession::$oSessionMap = unserialize( $_SESSION['sessionObject'] ); } // if / else } // public function __construct public function add( $sKey, $sValue ) { TestSession::$oSessionMap[ $sKey ] = $sValue; } // public function add public function get( $sKey ) { return TestSession::$oSessionMap[ $sKey ]; } // public function get public function __destruct() { $_SESSION['sessionObject'] = serialize(TestSession::$oSessionMap); } // public function __destruct } // class Session $oSes = new TestSession(); echo $oSes->get("test1","testval"); $oSes->add("test1","testval"); ?>
Index: ZendEngine2/zend.c =================================================================== RCS file: /repository/ZendEngine2/zend.c,v retrieving revision 1.285 diff -u -r1.285 zend.c --- ZendEngine2/zend.c 1 Jun 2004 11:45:46 -0000 1.285 +++ ZendEngine2/zend.c 2 Jul 2004 18:32:10 -0000 @@ -805,6 +805,13 @@ } zend_end_try(); } +void zend_call_destructors(TSRMLS_D) +{ + zend_try { + shutdown_destructors(TSRMLS_C); + } zend_end_try(); +} + void zend_deactivate(TSRMLS_D) { /* we're no longer executing anything */ Index: ZendEngine2/zend.h =================================================================== RCS file: /repository/ZendEngine2/zend.h,v retrieving revision 1.255 diff -u -r1.255 zend.h --- ZendEngine2/zend.h 7 Jun 2004 18:57:34 -0000 1.255 +++ ZendEngine2/zend.h 2 Jul 2004 18:32:11 -0000 @@ -450,6 +450,7 @@ void zend_activate(TSRMLS_D); void zend_deactivate(TSRMLS_D); +void zend_call_destructors(TSRMLS_D); void zend_activate_modules(TSRMLS_D); void zend_deactivate_modules(TSRMLS_D); void zend_post_deactivate_modules(TSRMLS_D); Index: ZendEngine2/zend_execute.h =================================================================== RCS file: /repository/ZendEngine2/zend_execute.h,v retrieving revision 1.72 diff -u -r1.72 zend_execute.h --- ZendEngine2/zend_execute.h 16 Mar 2004 10:14:52 -0000 1.72 +++ ZendEngine2/zend_execute.h 2 Jul 2004 18:32:11 -0000 @@ -49,6 +49,7 @@ void init_executor(TSRMLS_D); void shutdown_executor(TSRMLS_D); +void shutdown_destructors(TSRMLS_D); ZEND_API void execute(zend_op_array *op_array TSRMLS_DC); ZEND_API void execute_internal(zend_execute_data *execute_data_ptr, int return_value_used TSRMLS_DC); ZEND_API int zend_is_true(zval *op); Index: ZendEngine2/zend_execute_API.c =================================================================== RCS file: /repository/ZendEngine2/zend_execute_API.c,v retrieving revision 1.287 diff -u -r1.287 zend_execute_API.c --- ZendEngine2/zend_execute_API.c 18 May 2004 20:14:54 -0000 1.287 +++ ZendEngine2/zend_execute_API.c 2 Jul 2004 18:32:11 -0000 @@ -187,6 +187,12 @@ EG(float_separator)[0] = '.'; } +void shutdown_destructors(TSRMLS_D) { + zend_try { + zend_objects_store_call_destructors(&EG(objects_store) TSRMLS_CC); + } zend_end_try(); +} + void shutdown_executor(TSRMLS_D) { zend_try { @@ -206,7 +212,6 @@ } */ zend_llist_apply(&zend_extensions, (llist_apply_func_t) zend_extension_deactivator TSRMLS_CC); - zend_objects_store_call_destructors(&EG(objects_store) TSRMLS_CC); zend_hash_graceful_reverse_destroy(&EG(symbol_table)); } zend_end_try(); Index: main/main.c =================================================================== RCS file: /repository/php-src/main/main.c,v retrieving revision 1.604 diff -u -r1.604 main.c --- main/main.c 28 May 2004 14:14:26 -0000 1.604 +++ main/main.c 2 Jul 2004 18:32:16 -0000 @@ -1190,6 +1190,10 @@ sapi_send_headers(TSRMLS_C); } zend_end_try(); + zend_try { + zend_call_destructors(TSRMLS_C); + } zend_end_try(); + if (PG(modules_activated)) zend_try { php_call_shutdown_functions(); } zend_end_try();
-- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php