Here is an updated patch which copies a few of the methods from
main/main.c::php_request_shutdown to
sapi/apache/sapi_apache.c::apache_php_module_main.  This has flushed both
the headers and output buffers in my two test scripts.  Now I need to figure
out a way to make sure these don't get called in
main/main.c::php_request_shutdown on Apache systems.  Any pointers on this?
Is there a handy #define that I can use if configure is called --with-apxs?

Joseph

P.S.  The two test scripts are:

<?PHP
        header('Location: http://www.mi-corporation.com');
        exit();
?>

and

<?PHP
        ob_begin();
        phpinfo();
?>

> -----Original Message-----
> From: Brian Moon [mailto:[EMAIL PROTECTED]]
> Sent: Tuesday, January 28, 2003 5:50 PM
> To: [EMAIL PROTECTED]; Joseph Tate
> Cc: Php-Dev List; PHP Group
> Subject: Re: [PHP-DEV] Re: Register Shutdown Function for Apache
>
>
> Give me a patch and I will tell you. ;)
>
> Brian Moon
> dealnews.com
>
>
> ----- Original Message -----
> From: "Zeev Suraski" <[EMAIL PROTECTED]>
> To: "Joseph Tate" <[EMAIL PROTECTED]>
> Cc: "Brian Moon" <[EMAIL PROTECTED]>; "Php-Dev List"
> <[EMAIL PROTECTED]>; "PHP Group" <[EMAIL PROTECTED]>
> Sent: Tuesday, January 28, 2003 4:03 PM
> Subject: RE: [PHP-DEV] Re: Register Shutdown Function for Apache
>
>
> | At 19:54 28/01/2003, Joseph Tate wrote:
> | >Then, could we add a sapi_flush()/ob_flush() call at the end of
> | >apache_php_module_main after calling the normal
> register_shutdown_functions?
> |
> | Yeah, something along these lines.
> |
> | >What else might have problems?
> |
> | Might is a powerful word :)
> |
> | Zeev
> |
> |
> |
>
>
> --
> PHP Development Mailing List <http://www.php.net/>
> To unsubscribe, visit: http://www.php.net/unsub.php
>
>
>
? php4/ext/mysql/.libs
? php4/main/.main.c.swp
? php4/sapi/apache/.sapi_apache.c.swp
Index: php4/ext/standard/basic_functions.c
===================================================================
RCS file: /repository/php4/ext/standard/basic_functions.c,v
retrieving revision 1.543.2.4
diff -u -r1.543.2.4 basic_functions.c
--- php4/ext/standard/basic_functions.c 20 Dec 2002 16:37:44 -0000      1.543.2.4
+++ php4/ext/standard/basic_functions.c 3 Feb 2003 21:32:05 -0000
@@ -1121,6 +1121,7 @@
        }
 #endif
        BG(user_shutdown_function_names) = NULL;
+       BG(user_apache_shutdown_function_names) = NULL;
 
 #if HAVE_CRYPT
        PHP_RINIT(crypt) (INIT_FUNC_ARGS_PASSTHRU);
@@ -2085,32 +2086,28 @@
        }
 }
 
-void php_call_shutdown_functions(void)
+PHPAPI void php_call_shutdown_functions(HashTable ** names)
 {
        TSRMLS_FETCH();
 
-       if (BG(user_shutdown_function_names))
+       if (*names){
                zend_try {
-                       zend_hash_apply(BG(user_shutdown_function_names), 
(apply_func_t) user_shutdown_function_call TSRMLS_CC);
+                       zend_hash_apply(*names, (apply_func_t) 
+user_shutdown_function_call TSRMLS_CC);
                        memcpy(&EG(bailout), &orig_bailout, sizeof(jmp_buf));
-                       zend_hash_destroy(BG(user_shutdown_function_names));
-                       efree(BG(user_shutdown_function_names));
+                       zend_hash_destroy(*names);
+                       efree(*names);
+                       *names = NULL;
                }
-               zend_end_try();
+           zend_end_try();
+       }
 }
 
-/* {{{ proto void register_shutdown_function(string function_name)
-   Register a user-level function to be called on request termination */
-PHP_FUNCTION(register_shutdown_function)
+PHPAPI void register_shutdown_function_entry(HashTable ** names, int ht, zval * 
+return_value)
 {
        php_shutdown_function_entry shutdown_function_entry;
        int i;
 
-       shutdown_function_entry.arg_count = ZEND_NUM_ARGS();
-
-       if (shutdown_function_entry.arg_count < 1) {
-               WRONG_PARAM_COUNT;
-       }
+       shutdown_function_entry.arg_count = (ht);
 
        shutdown_function_entry.arguments = (pval **) emalloc(sizeof(pval *) 
*shutdown_function_entry.arg_count);
 
@@ -2118,14 +2115,26 @@
                RETURN_FALSE;
        }
        if (!BG(user_shutdown_function_names)) {
-               ALLOC_HASHTABLE(BG(user_shutdown_function_names));
-               zend_hash_init(BG(user_shutdown_function_names), 0, NULL, (void 
(*)(void *)) user_shutdown_function_dtor, 0);
+               ALLOC_HASHTABLE(*names);
+               zend_hash_init(*names, 0, NULL, (void (*)(void *)) 
+user_shutdown_function_dtor, 0);
        }
 
        for (i = 0; i < shutdown_function_entry.arg_count; i++) {
                shutdown_function_entry.arguments[i]->refcount++;
        }
-       zend_hash_next_index_insert(BG(user_shutdown_function_names), 
&shutdown_function_entry, sizeof(php_shutdown_function_entry), NULL);
+       zend_hash_next_index_insert(*names, &shutdown_function_entry, 
+sizeof(php_shutdown_function_entry), NULL);
+       RETURN_TRUE;
+}
+
+/* {{{ proto void register_shutdown_function(string function_name)
+   Register a user-level function to be called on request termination */
+PHP_FUNCTION(register_shutdown_function)
+{
+       if (ZEND_NUM_ARGS() < 1) {
+               WRONG_PARAM_COUNT;
+       }
+
+       register_shutdown_function_entry(&BG(user_shutdown_function_names), ht, 
+return_value);
 }
 /* }}} */
 
Index: php4/ext/standard/basic_functions.h
===================================================================
RCS file: /repository/php4/ext/standard/basic_functions.h,v
retrieving revision 1.109
diff -u -r1.109 basic_functions.h
--- php4/ext/standard/basic_functions.h 5 Nov 2002 06:05:48 -0000       1.109
+++ php4/ext/standard/basic_functions.h 3 Feb 2003 21:32:05 -0000
@@ -74,6 +74,8 @@
 PHP_FUNCTION(highlight_string);
 ZEND_API void php_get_highlight_struct(zend_syntax_highlighter_ini 
*syntax_highlighter_ini);
 
+PHPAPI void register_shutdown_function_entry(HashTable **names, int ht, zval 
+*return_value);
+
 PHP_FUNCTION(ini_get);
 PHP_FUNCTION(ini_get_all);
 PHP_FUNCTION(ini_set);
@@ -130,6 +132,7 @@
 
 typedef struct {
        HashTable *user_shutdown_function_names;
+       HashTable *user_apache_shutdown_function_names;
        HashTable putenv_ht;
        zval *strtok_zval;
        char *strtok_string;
Index: php4/main/main.c
===================================================================
RCS file: /repository/php4/main/main.c,v
retrieving revision 1.512.2.5
diff -u -r1.512.2.5 main.c
--- php4/main/main.c    16 Dec 2002 15:44:06 -0000      1.512.2.5
+++ php4/main/main.c    3 Feb 2003 21:32:07 -0000
@@ -912,6 +912,8 @@
 {
        TSRMLS_FETCH();
 
+       /* TODO: Figure out how to skip this on Apache Systems
+        */
        zend_try {
                php_end_ob_buffers((zend_bool)(SG(request_info).headers_only?0:1) 
TSRMLS_CC);
        } zend_end_try();
@@ -920,8 +922,10 @@
                sapi_send_headers(TSRMLS_C);
        } zend_end_try();
 
-       if (PG(modules_activated)) zend_try {
-               php_call_shutdown_functions();
+       if (PG(modules_activated) && BG(user_shutdown_function_names)) zend_try {
+               /* under Apache, this will not execute because the HashTable will not 
+exist.
+                */
+               php_call_shutdown_functions(& BG(user_shutdown_function_names));
        } zend_end_try();
        
        if (PG(modules_activated)) {
Index: php4/main/php_main.h
===================================================================
RCS file: /repository/php4/main/php_main.h,v
retrieving revision 1.23
diff -u -r1.23 php_main.h
--- php4/main/php_main.h        18 Sep 2002 21:57:29 -0000      1.23
+++ php4/main/php_main.h        3 Feb 2003 21:32:07 -0000
@@ -47,7 +47,7 @@
 
 PHPAPI void php_html_puts(const char *str, uint siz TSRMLS_DC);
 
-extern void php_call_shutdown_functions(void);
+extern void php_call_shutdown_functions(HashTable **names);
 
 /* environment module */
 extern int php_init_environ(void);
Index: php4/sapi/apache/mod_php4.c
===================================================================
RCS file: /repository/php4/sapi/apache/mod_php4.c,v
retrieving revision 1.146.2.1
diff -u -r1.146.2.1 mod_php4.c
--- php4/sapi/apache/mod_php4.c 21 Dec 2002 20:09:09 -0000      1.146.2.1
+++ php4/sapi/apache/mod_php4.c 3 Feb 2003 21:32:08 -0000
@@ -295,8 +295,13 @@
        SG(server_context) = NULL; /* The server context (request) is invalid by the 
time run_cleanups() is called */
        if (AP(in_request)) {
                AP(in_request) = 0;
-               php_request_shutdown(dummy);
        }
+       else{
+               php_call_shutdown_functions(& BG(user_apache_shutdown_function_names));
+       }
+       zend_try {
+               php_request_shutdown(dummy);
+       } zend_end_try();
 }
 /* }}} */
 
Index: php4/sapi/apache/mod_php4.h
===================================================================
RCS file: /repository/php4/sapi/apache/mod_php4.h,v
retrieving revision 1.17
diff -u -r1.17 mod_php4.h
--- php4/sapi/apache/mod_php4.h 28 Feb 2002 08:27:19 -0000      1.17
+++ php4/sapi/apache/mod_php4.h 3 Feb 2003 21:32:08 -0000
@@ -35,6 +35,7 @@
 } php_apache_info_struct;
 
 extern zend_module_entry apache_module_entry;
+extern void php_call_apache_shutdown_functions(HashTable **names);
 
 #ifdef ZTS
 extern int php_apache_info_id;
Index: php4/sapi/apache/php_apache.c
===================================================================
RCS file: /repository/php4/sapi/apache/php_apache.c,v
retrieving revision 1.69.2.1
diff -u -r1.69.2.1 php_apache.c
--- php4/sapi/apache/php_apache.c       5 Dec 2002 23:19:02 -0000       1.69.2.1
+++ php4/sapi/apache/php_apache.c       3 Feb 2003 21:32:08 -0000
@@ -44,6 +44,7 @@
 PHP_FUNCTION(apache_lookup_uri);
 PHP_FUNCTION(apache_child_terminate);
 PHP_FUNCTION(apache_setenv);
+PHP_FUNCTION(apache_register_shutdown_function);
 
 PHP_MINFO_FUNCTION(apache);
 
@@ -54,6 +55,7 @@
        PHP_FE(apache_lookup_uri,                                               NULL)
        PHP_FE(apache_child_terminate,                                  NULL)
        PHP_FE(apache_setenv,                                                   NULL)
+       PHP_FE(apache_register_shutdown_function,               NULL)
        PHP_FE(apache_response_headers,                                 NULL)
        PHP_FALIAS(getallheaders, apache_request_headers, NULL)
        {NULL, NULL, NULL}
@@ -471,6 +473,22 @@
        }
 
        destroy_sub_req(rr);
+}
+/* }}} */
+
+/* {{{ proto void apache_register_shutdown_function(string function_name)
+ * Register a user-level function to be called on request termination: executed after 
+the
+ * connection has closed.  This function is only available on Apache web servers 
+using the
+ * SAPI module as it uses Apache calls to execute the functions after the connection 
+has
+ * closed.  Nothing using "print"/"echo" will be sent to the client.
+ */
+PHP_FUNCTION(apache_register_shutdown_function)
+{
+       if (ZEND_NUM_ARGS() < 1) {
+               WRONG_PARAM_COUNT;
+       }
+
+       register_shutdown_function_entry(&BG(user_apache_shutdown_function_names), ht, 
+return_value);
 }
 /* }}} */
 
Index: php4/sapi/apache/sapi_apache.c
===================================================================
RCS file: /repository/php4/sapi/apache/sapi_apache.c,v
retrieving revision 1.40
diff -u -r1.40 sapi_apache.c
--- php4/sapi/apache/sapi_apache.c      23 Apr 2002 03:01:30 -0000      1.40
+++ php4/sapi/apache/sapi_apache.c      3 Feb 2003 21:32:08 -0000
@@ -56,11 +56,29 @@
        }
 
        AP(in_request) = 0;
-       
+
+    zend_try {
+               php_end_ob_buffers((zend_bool)(SG(request_info).headers_only?0:1) 
+TSRMLS_CC);
+       } zend_end_try();
+
+       zend_try {
+               sapi_send_headers(TSRMLS_C);
+       } zend_end_try();
+
+       /* Call the shutdown functions while the connection is still active. */
+       if (PG(modules_activated)) zend_try {
+               php_call_shutdown_functions(& BG(user_shutdown_function_names));
+       } zend_end_try();
+
+#if 0
+       /* Removed by jtate Jan. 7, 2003 because php_request_shutdown is now called as
+        * an Apache cleanup function.
+        */
        zend_try {
                php_request_shutdown(NULL);
        } zend_end_try();
-       
+#endif
+               
        return (OK);
 }
 /* }}} */

-- 
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to