Here's an incremental patch on Lukas' patch which tries to address a 
couple issues:

o  The startup sequence has been changed to allow for post-data to make 
it through if any hooks before full post-data is read are called
o  works under register_globals Off ($request is now available in the 
SERVER var hash when register globals is enabled)
o  all hooks and the 'main' content handler all share a common scope 
(there is only one call to zend_startup, and only one shutdown).  This 
is significantly cheaper plus it allows for handy stuff like creating 
data structures in a hook and magicall passing them to other hooks or 
into the main script.  This is experimental and may break some of the 
other sapi modules as-is (though that clearly wasn't the intention ;)

George


Lukas Schroeder wrote:

>hi,
>
>here's another shot of the current apache_hooks code.
>
>there are some issues with startup and cleanup currently.
>and the patch messes a bit with php's startup procedure.
>
>still missing is access to array_header (think headers_in, headers_out,
>headers_err) and table slot in request_rec, as is access to the
>whole connection structure of the request.
>
>but the string and int fields can be read and where appropriate written
>to. and there are some methods that wrap the ap_ family.
>
>
>
>regards,
>  -lukas
>


diff -u3 -r php4-lucas3/main/SAPI.c php4-george/main/SAPI.c
--- php4-lucas3/main/SAPI.c     Mon Aug 26 11:44:12 2002
+++ php4-george/main/SAPI.c     Mon Aug 26 12:05:51 2002
@@ -382,6 +382,7 @@
                SG(sapi_headers).mimetype = NULL;
        }
        sapi_send_headers_free(TSRMLS_C);
+    SG(sapi_started) = 0;
 }
 
 
diff -u3 -r php4-lucas3/main/SAPI.h php4-george/main/SAPI.h
--- php4-lucas3/main/SAPI.h     Mon Aug 26 11:44:12 2002
+++ php4-george/main/SAPI.h     Mon Aug 26 12:04:04 2002
@@ -117,6 +117,7 @@
        HashTable *rfc1867_uploaded_files;
        long post_max_size;
     int options;
+    zend_bool sapi_started;
 } sapi_globals_struct;
 
 
diff -u3 -r php4-lucas3/main/main.c php4-george/main/main.c
--- php4-lucas3/main/main.c     Mon Aug 26 11:45:03 2002
+++ php4-george/main/main.c     Mon Aug 26 12:42:10 2002
@@ -816,54 +816,52 @@
 /* {{{ php_request_startup
  */
 int php_request_startup(TSRMLS_D)
-{
-       int retval = SUCCESS;
-
+{           
+    int retval = SUCCESS;
 #if PHP_SIGCHILD
-       signal(SIGCHLD, sigchld_handler);
-#endif
-
-       zend_try {
-               PG(during_request_startup) = 1;
-               
-               php_output_activate(TSRMLS_C);
-
-               /* initialize global variables */
-               PG(modules_activated) = 0;
-               PG(header_is_being_sent) = 0;
-               PG(connection_status) = PHP_CONNECTION_NORMAL;
-               
-               zend_activate(TSRMLS_C);
-               sapi_activate(TSRMLS_C);
-
-               zend_set_timeout(EG(timeout_seconds));
-
-               if (PG(expose_php)) {
-                       sapi_add_header(SAPI_PHP_VERSION_HEADER, 
sizeof(SAPI_PHP_VERSION_HEADER)-1, 1);
-               }
-
-               if (PG(output_handler) && PG(output_handler)[0]) {
-                       php_start_ob_buffer_named(PG(output_handler), 0, 1 TSRMLS_CC);
-               }
-               else if (PG(output_buffering)) {
-                       php_start_ob_buffer(NULL, 0, 1 TSRMLS_CC);
-               }
-               else if (PG(implicit_flush)) {
-                       php_start_implicit_flush(TSRMLS_C);
-               }
-
-               /* We turn this off in php_execute_script() */
-               /* PG(during_request_startup) = 0; */
-
-               php_hash_environment(TSRMLS_C);
-               zend_activate_modules(TSRMLS_C);
-               PG(modules_activated)=1;
-       } zend_catch {
-               retval = FAILURE;
-       } zend_end_try();
+    signal(SIGCHLD, sigchld_handler);
+#endif          
+    if(!SG(sapi_started)) {
+        zend_try {
+            PG(during_request_startup) = 1;
+                
+            /* initialize global variables */
+            PG(modules_activated) = 0;
+            PG(header_is_being_sent) = 0;
+            PG(connection_status) = PHP_CONNECTION_NORMAL;
+            
+            zend_activate(TSRMLS_C);
+            zend_set_timeout(EG(timeout_seconds));
+            zend_activate_modules(TSRMLS_C);
+            PG(modules_activated)=1;
+        } zend_catch {
+            retval = FAILURE;
+        } zend_end_try();
+        SG(sapi_started) = 1;
+    }           
+    php_output_activate(TSRMLS_C);
+    sapi_activate(TSRMLS_C);
+    php_hash_environment(TSRMLS_C);
+    zend_try {
+        if (PG(expose_php)) {
+            sapi_add_header(SAPI_PHP_VERSION_HEADER, 
+sizeof(SAPI_PHP_VERSION_HEADER)-1, 1);
+        }
+        if (PG(output_handler) && PG(output_handler)[0]) {
+            php_start_ob_buffer_named(PG(output_handler), 0, 1 TSRMLS_CC);
+        }
+        else if (PG(output_buffering)) {
+            php_start_ob_buffer(NULL, 0, 1 TSRMLS_CC);
+        }
+        else if (PG(implicit_flush)) {
+            php_start_implicit_flush(TSRMLS_C);
+        }
+    } zend_catch {
+        retval = FAILURE;
+    } zend_end_try();
 
-       return retval;
+    return retval;
 }
+
 /* }}} */
 
 /* {{{ php_request_startup_for_hook
@@ -871,25 +869,26 @@
 int php_request_startup_for_hook(TSRMLS_D)
 {
        int retval = SUCCESS;
-
 #if PHP_SIGCHLD
        signal(SIGCHLD, sigchld_handler);
 #endif
-
-       zend_try {
-               PG(during_request_startup) = 1;
-               PG(modules_activated) = 0;
-               PG(header_is_being_sent) = 0;
-               PG(connection_status) = PHP_CONNECTION_NORMAL;
-               zend_activate(TSRMLS_C);
-               sapi_activate(TSRMLS_C);
-               zend_set_timeout(EG(timeout_seconds));
-               php_hash_environment(TSRMLS_C);
-               zend_activate_modules(TSRMLS_C);
-               PG(modules_activated) = 1;
-       } zend_catch {
-               retval = FAILURE;
-       } zend_end_try();
+    if(!SG(sapi_started)) {
+       zend_try {
+               PG(during_request_startup) = 1;
+               PG(modules_activated) = 0;
+               PG(header_is_being_sent) = 0;
+               PG(connection_status) = PHP_CONNECTION_NORMAL;
+               zend_activate(TSRMLS_C);
+               zend_activate_modules(TSRMLS_C);
+               PG(modules_activated) = 1;
+       } zend_catch {
+               retval = FAILURE;
+       } zend_end_try();
+        SG(sapi_started) = 1;
+    }
+    sapi_activate(TSRMLS_C);
+    zend_set_timeout(EG(timeout_seconds));
+    php_hash_environment(TSRMLS_C);
 
        return retval;
 }
@@ -912,7 +911,6 @@
 void php_request_shutdown_for_hook(void *dummy)
 {
        TSRMLS_FETCH();
-
        if (PG(modules_activated)) zend_try {
                php_call_shutdown_functions();
        } zend_end_try();
diff -u3 -r php4-lucas3/sapi/apache/mod_php4.c php4-george/sapi/apache/mod_php4.c
--- php4-lucas3/sapi/apache/mod_php4.c  Mon Aug 26 11:45:03 2002
+++ php4-george/sapi/apache/mod_php4.c  Mon Aug 26 12:41:40 2002
@@ -290,13 +290,13 @@
 static void php_apache_request_shutdown(void *dummy)
 {
        TSRMLS_FETCH();
-
        php_output_set_status(0 TSRMLS_CC);
        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;
+    if(SG(sapi_started)) {
                php_request_shutdown(dummy);
+        SG(sapi_started) = 0;
        }
+    AP(in_request) = 0;
     if(AP(setup_env)) {
         AP(setup_env) = 0;
     }
diff -u3 -r php4-lucas3/sapi/apache/sapi_apache.c php4-george/sapi/apache/sapi_apache.c
--- php4-lucas3/sapi/apache/sapi_apache.c       Mon Aug 26 11:45:03 2002
+++ php4-george/sapi/apache/sapi_apache.c       Mon Aug 26 11:49:02 2002
@@ -57,10 +57,6 @@
 
        AP(in_request) = 0;
        
-       zend_try {
-               php_request_shutdown(NULL);
-       } zend_end_try();
-       
        return (OK);
 }
 /* }}} */
@@ -76,20 +72,20 @@
        signal(SIGCHLD, sigchld_handler);
 #endif
 
-       if (AP(setup_env) != 2) {
-               fprintf(stderr, "REQUEST STARTUP\n");
+    if (php_request_startup_for_hook(TSRMLS_C) == FAILURE)
+            return FAILURE;
 
-               if (php_request_startup(TSRMLS_C) == FAILURE)
-                       return FAILURE;
-               AP(setup_env) = 2;
-       }
 
        /* Add PHP_SELF_HOOK - Absolute path */
        php_register_variable("PHP_SELF_HOOK", filename, 
PG(http_globals)[TRACK_VARS_SERVER] TSRMLS_CC);
 
        req = php_apache_request_new(r);
-       php_register_variable_ex("request", req, NULL TSRMLS_CC);
-
+    if(PG(register_globals)) {
+        php_register_variable_ex("request", req, NULL TSRMLS_CC);
+    }
+    else {
+        php_register_variable_ex("request", req, PG(http_globals)[TRACK_VARS_SERVER] 
+TSRMLS_CC);
+    }
        memset(&file_handle, 0, sizeof(file_handle));
        file_handle.type = ZEND_HANDLE_FILENAME;
        file_handle.filename = filename;
@@ -98,10 +94,6 @@
 
        zval_dtor(&req);
        AP(in_request) = 0;
-
-//     zend_try {
-//             php_request_shutdown_for_hook(NULL);
-//     } zend_end_try();
 
        return OK;
 }

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

Reply via email to