From: Zeev Suraski Date: Sat, 25 Aug 2001 15:57:42 +0000 (+0000) Subject: Move the trans-sid mechanism to use the output buffering mechanism. X-Git-Tag: PRE_SUBST_Z_MACROS~363 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=13ff183225ef9159a33b8489cbaab9685e4820da;p=php Move the trans-sid mechanism to use the output buffering mechanism. Advantages: - Would work with the output buffering mechanism in general, and with output compression in particular - Should yield better performance (untested as of yet) --- diff --git a/ext/session/php_session.h b/ext/session/php_session.h index 18539685d8..453f3a7d82 100644 --- a/ext/session/php_session.h +++ b/ext/session/php_session.h @@ -144,17 +144,16 @@ typedef struct ps_serializer_struct { { #x, PS_SERIALIZER_ENCODE_NAME(x), PS_SERIALIZER_DECODE_NAME(x) } #ifdef TRANS_SID -void session_adapt_uris(const char *, size_t, char **, size_t * TSRMLS_DC); +void session_adapt_uris(const char *, size_t, char **, size_t *,zend_bool TSRMLS_DC); void session_adapt_url(const char *, size_t, char **, size_t * TSRMLS_DC); -void session_adapt_flush(int (*)(const char *, uint TSRMLS_DC) TSRMLS_DC); #else -#define session_adapt_uris(a,b,c,d) do { } while(0) +#define session_adapt_uris(a,b,c,d,e) do { } while(0) #define session_adapt_url(a,b,c,d) do { } while(0) -#define session_adapt_flush(a) do { } while(0) #endif void php_set_session_var(char *name, size_t namelen, zval *state_val,HashTable *var_hash TSRMLS_DC); int php_get_session_var(char *name, size_t namelen, zval ***state_var TSRMLS_DC); +void php_session_start_output_handler(INIT_FUNC_ARGS, uint chunk_size); int php_session_register_module(ps_module *); diff --git a/ext/session/session.c b/ext/session/session.c index 538f9d1264..af3c63a4d5 100644 --- a/ext/session/session.c +++ b/ext/session/session.c @@ -523,6 +523,7 @@ static void php_session_initialize(TSRMLS_D) } } + static void php_session_save_current_state(TSRMLS_D) { char *val; @@ -1280,25 +1281,18 @@ PHP_FUNCTION(session_destroy) /* }}} */ #ifdef TRANS_SID -void session_adapt_uris(const char *src, size_t srclen, char **new, size_t *newlen TSRMLS_DC) +void session_adapt_uris(const char *src, size_t srclen, char **new, size_t *newlen, zend_bool do_flush TSRMLS_DC) { - if (PS(define_sid) && (PS(session_status) == php_session_active)) - *new = url_adapt_ext_ex(src, srclen, PS(session_name), PS(id), newlen TSRMLS_CC); + if (PS(define_sid) && (PS(session_status) == php_session_active)) { + *new = url_adapt_ext_ex(src, srclen, PS(session_name), PS(id), newlen, do_flush TSRMLS_CC); + } } void session_adapt_url(const char *url, size_t urllen, char **new, size_t *newlen TSRMLS_DC) { - if (PS(define_sid) && (PS(session_status) == php_session_active)) + if (PS(define_sid) && (PS(session_status) == php_session_active)) { *new = url_adapt_single_url(url, urllen, PS(session_name), PS(id), newlen TSRMLS_CC); -} - -void session_adapt_flush(int (*write)(const char *, uint TSRMLS_DC) TSRMLS_DC) -{ - char *str; - size_t len; - - str = url_adapt_flush(&len TSRMLS_CC); - if (str) write(str, len TSRMLS_CC); + } } #endif @@ -1426,6 +1420,26 @@ PHP_MINFO_FUNCTION(session) DISPLAY_INI_ENTRIES(); } + +static void php_session_output_handler(char *output, uint output_len, char **handled_output, uint *handled_output_len, int mode TSRMLS_DC) +{ + zend_bool do_flush; + + if (mode&PHP_OUTPUT_HANDLER_END) { + do_flush=1; + } + session_adapt_uris(output, output_len, handled_output, handled_output_len, do_flush TSRMLS_CC); +} + + +void php_session_start_output_handler(INIT_FUNC_ARGS, uint chunk_size) +{ + PHP_RINIT(url_scanner)(INIT_FUNC_ARGS_PASSTHRU); + PHP_RINIT(url_scanner_ex)(INIT_FUNC_ARGS_PASSTHRU); + php_start_ob_buffer(NULL, chunk_size TSRMLS_CC); + php_ob_set_internal_handler(php_session_output_handler, chunk_size TSRMLS_CC); +} + /* * Local variables: * tab-width: 4 diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index dd3487e567..7f680af675 100644 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -28,6 +28,7 @@ #include "php_math.h" #include "php_incomplete_class.h" #include "ext/standard/info.h" +#include "ext/session/php_session.h" #include "zend_operators.h" #include #include @@ -882,8 +883,7 @@ PHP_RINIT_FUNCTION(basic) #ifdef TRANS_SID if (BG(use_trans_sid)) { - PHP_RINIT(url_scanner)(INIT_FUNC_ARGS_PASSTHRU); - PHP_RINIT(url_scanner_ex)(INIT_FUNC_ARGS_PASSTHRU); + php_session_start_output_handler(INIT_FUNC_ARGS_PASSTHRU, 4096); } #endif diff --git a/ext/standard/url_scanner_ex.c b/ext/standard/url_scanner_ex.c index 35dff9f381..0c397cd2a6 100644 --- a/ext/standard/url_scanner_ex.c +++ b/ext/standard/url_scanner_ex.c @@ -836,7 +836,7 @@ char *url_adapt_single_url(const char *url, size_t urllen, const char *name, con return buf.c; } -char *url_adapt_ext(const char *src, size_t srclen, const char *name, const char *value, size_t *newlen TSRMLS_DC) +char *url_adapt_ext(const char *src, size_t srclen, const char *name, const char *value, size_t *newlen, zend_bool do_flush TSRMLS_DC) { char *ret; url_adapt_state_ex_t *ctx; @@ -848,9 +848,16 @@ char *url_adapt_ext(const char *src, size_t srclen, const char *name, const char mainloop(ctx, src, srclen TSRMLS_CC); *newlen = ctx->result.len; - if (!ctx->result.c) + if (!ctx->result.c) { smart_str_appendl(&ctx->result, "", 0); + } smart_str_0(&ctx->result); + if (do_flush) { + smart_str_appendl(&ctx->result, ctx->buf.c, ctx->buf.len); + *newlen += ctx->buf.len; + ctx->buf.c = 0; + ctx->buf.len = 0; + } ctx->result.len = 0; return ctx->result.c; } diff --git a/ext/standard/url_scanner_ex.h b/ext/standard/url_scanner_ex.h index d5595570ae..7a90a6d7bf 100644 --- a/ext/standard/url_scanner_ex.h +++ b/ext/standard/url_scanner_ex.h @@ -24,7 +24,7 @@ PHP_MSHUTDOWN_FUNCTION(url_scanner_ex); PHP_RSHUTDOWN_FUNCTION(url_scanner_ex); PHP_RINIT_FUNCTION(url_scanner_ex); -char *url_adapt_ext_ex(const char *src, size_t srclen, const char *name, const char *value, size_t *newlen TSRMLS_DC); +char *url_adapt_ext_ex(const char *src, size_t srclen, const char *name, const char *value, size_t *newlen, zend_bool do_flush TSRMLS_DC); char *url_adapt_single_url(const char *url, size_t urllen, const char *name, const char *value, size_t *newlen TSRMLS_DC); diff --git a/ext/standard/url_scanner_ex.re b/ext/standard/url_scanner_ex.re index 2bcc2a286b..b0dc0af4ee 100644 --- a/ext/standard/url_scanner_ex.re +++ b/ext/standard/url_scanner_ex.re @@ -352,7 +352,7 @@ char *url_adapt_single_url(const char *url, size_t urllen, const char *name, con return buf.c; } -char *url_adapt_ext(const char *src, size_t srclen, const char *name, const char *value, size_t *newlen TSRMLS_DC) +char *url_adapt_ext(const char *src, size_t srclen, const char *name, const char *value, size_t *newlen, zend_bool do_flush TSRMLS_DC) { char *ret; url_adapt_state_ex_t *ctx; @@ -364,9 +364,16 @@ char *url_adapt_ext(const char *src, size_t srclen, const char *name, const char mainloop(ctx, src, srclen TSRMLS_CC); *newlen = ctx->result.len; - if (!ctx->result.c) + if (!ctx->result.c) { smart_str_appendl(&ctx->result, "", 0); + } smart_str_0(&ctx->result); + if (do_flush) { + smart_str_appendl(&ctx->result, ctx->buf.c, ctx->buf.len); + *newlen += ctx->buf.len; + ctx->buf.c = 0; + ctx->buf.len = 0; + } ctx->result.len = 0; return ctx->result.c; } diff --git a/main/output.c b/main/output.c index d8a10cfa6d..e78b9e2d5a 100644 --- a/main/output.c +++ b/main/output.c @@ -21,7 +21,6 @@ #include "php.h" #include "ext/standard/head.h" -#include "ext/session/php_session.h" #include "ext/standard/basic_functions.h" #include "SAPI.h" @@ -253,10 +252,6 @@ PHPAPI void php_end_ob_buffers(zend_bool send_buffer TSRMLS_DC) while (OG(ob_nesting_level)!=0) { php_end_ob_buffer(send_buffer, 0 TSRMLS_CC); } - - if (!OG(disable_output) && send_buffer && BG(use_trans_sid)) { - session_adapt_flush(OG(php_header_write) TSRMLS_CC); - } } /* }}} */ @@ -427,11 +422,7 @@ static int php_ub_body_write_no_header(const char *str, uint str_length TSRMLS_D if (OG(disable_output)) { return 0; - } - if (BG(use_trans_sid)) { - session_adapt_uris(str, str_length, &newstr, &new_length TSRMLS_CC); - } - + } if (newstr) { str = newstr; str_length = new_length;