sniper Thu Apr 28 03:50:54 2005 EDT Modified files: /php-src/main main.c Log: - Reorder request shutdown calls: Call all __destruct() functions and register_shutdown_function() callbacks before flushing output buffers and sending headers. - Fixes bug #30578 and possibly others related to output buffering. # Added some comments too about what happens and where http://cvs.php.net/diff.php/php-src/main/main.c?r1=1.625&r2=1.626&ty=u Index: php-src/main/main.c diff -u php-src/main/main.c:1.625 php-src/main/main.c:1.626 --- php-src/main/main.c:1.625 Wed Apr 27 17:24:37 2005 +++ php-src/main/main.c Thu Apr 28 03:50:53 2005 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: main.c,v 1.625 2005/04/27 21:24:37 andrey Exp $ */ +/* $Id: main.c,v 1.626 2005/04/28 07:50:53 sniper Exp $ */ /* {{{ includes */ @@ -1133,6 +1133,7 @@ void php_request_shutdown_for_hook(void *dummy) { TSRMLS_FETCH(); + if (PG(modules_activated)) zend_try { php_call_shutdown_functions(TSRMLS_C); } zend_end_try(); @@ -1177,32 +1178,39 @@ TSRMLS_FETCH(); report_memleaks = PG(report_memleaks); + /* EG(opline_ptr) points into nirvana and therefore cannot be safely accessed * inside zend_executor callback functions. */ EG(opline_ptr) = NULL; + /* 1. Call all possible __destruct() functions */ zend_try { - php_end_ob_buffers((zend_bool)(SG(request_info).headers_only?0:1) TSRMLS_CC); + zend_call_destructors(TSRMLS_C); } zend_end_try(); + /* 2. Call all possible shutdown functions registered with register_shutdown_function() */ + if (PG(modules_activated)) zend_try { + php_call_shutdown_functions(TSRMLS_C); + } zend_end_try(); + + /* 3. Flush all output buffers */ zend_try { - sapi_send_headers(TSRMLS_C); + php_end_ob_buffers((zend_bool)(SG(request_info).headers_only?0:1) TSRMLS_CC); } zend_end_try(); + /* 4. Send the set HTTP headers (note: This must be done AFTER php_end_ob_buffers() !!) */ zend_try { - zend_call_destructors(TSRMLS_C); + sapi_send_headers(TSRMLS_C); } zend_end_try(); - if (PG(modules_activated)) zend_try { - php_call_shutdown_functions(TSRMLS_C); - } zend_end_try(); - + /* 5. Call all extensions RSHUTDOWN functions */ if (PG(modules_activated)) { zend_deactivate_modules(TSRMLS_C); php_free_shutdown_functions(TSRMLS_C); } + /* 6. Destroy super-globals */ zend_try { int i; @@ -1213,21 +1221,25 @@ } } zend_end_try(); - + /* 7. Shutdown scanner/executor/compiler and restore ini entries */ zend_deactivate(TSRMLS_C); + /* 8. Call all extensions post-RSHUTDOWN functions */ zend_try { zend_post_deactivate_modules(TSRMLS_C); } zend_end_try(); + /* 9. SAPI related shutdown (free stuff) */ zend_try { sapi_deactivate(TSRMLS_C); } zend_end_try(); + /* 10. Free Willy (here be crashes) */ zend_try { shutdown_memory_manager(CG(unclean_shutdown) || !report_memleaks, 0 TSRMLS_CC); } zend_end_try(); + /* 11. Reset max_execution_time */ zend_try { zend_unset_timeout(TSRMLS_C); } zend_end_try();
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php