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