hi, i've written a small patch which logs php's peak memory usage to the apache log-file. after applying this patch (against latest CVS) you should configure php using "--enable-memory-usage". after compile and installing you have a new apache (and _only_ apache) log-directive called mod_php_memory_usage which contains the peak-memory usage for your page. by adding it to your apache LogFormat you will now get this valuable information in your log and you can easily spot pages that need lots of memory! hoto say "%{mod_php_memory_usage}n" in you LogFormat: LogFormat "%h %l %u %t \"%r\" %>s %b PHP:%{mod_php_memory_usage}n \"%{Referer}i\" \"%{User-Agent}i\"" combined patch is attached (should cause _very near_ to no performance hit) zeev (& others;-), using AG() after send_parsed_php *is* safe as the various shutdown functions are first called from the apache shutdown handler - which is calling up *way* after this. re, tc
Index: sapi/apache/mod_php4.c =================================================================== RCS file: /repository/php4/sapi/apache/mod_php4.c,v retrieving revision 1.94 diff -u -r1.94 mod_php4.c --- sapi/apache/mod_php4.c 2001/05/07 22:02:44 1.94 +++ sapi/apache/mod_php4.c 2001/05/10 11:54:17 @@ -540,7 +540,19 @@ static int send_parsed_php(request_rec * r) { - return send_php(r, 0, NULL); + int result = send_php(r, 0, NULL); + +#if MEMORY_USAGE + { + char mem_usage[ 32 ]; + ALS_FETCH() + + sprintf(mem_usage,"%u", (int) AG(max_allocated_memory)); + ap_table_setn(r->notes, "mod_php_memory_usage", +ap_pstrdup(r->pool,mem_usage)); + } +#endif + + return result; } Index: Zend/Zend.m4 =================================================================== RCS file: /repository/Zend/Zend.m4,v retrieving revision 1.22 diff -u -r1.22 Zend.m4 --- Zend/Zend.m4 2001/03/11 19:35:25 1.22 +++ Zend/Zend.m4 2001/05/10 11:56:23 @@ -123,6 +123,13 @@ ZEND_MEMORY_LIMIT=no ]) +AC_ARG_ENABLE(memory-usage, +[ --enable-memory-usage Compile with memory usage support. ], [ + ZEND_MEMORY_USAGE=$enableval +],[ + ZEND_MEMORY_USAGE=no +]) + AC_MSG_CHECKING(whether to enable experimental ZTS) AC_MSG_RESULT($ZEND_EXPERIMENTAL_ZTS) @@ -132,6 +139,9 @@ AC_MSG_CHECKING(whether to enable a memory limit) AC_MSG_RESULT($ZEND_MEMORY_LIMIT) +AC_MSG_CHECKING(whether to enable a memory usage) +AC_MSG_RESULT($ZEND_MEMORY_USAGE) + AC_MSG_CHECKING(whether to enable Zend debugging) AC_MSG_RESULT($ZEND_DEBUG) @@ -166,6 +176,13 @@ else AC_DEFINE(MEMORY_LIMIT, 0, [Memory limit]) fi + +if test "$ZEND_MEMORY_USAGE" = "yes"; then + AC_DEFINE(MEMORY_USAGE, 1, [Memory usage]) +else + AC_DEFINE(MEMORY_USAGE, 0, [Memory usage]) +fi + changequote({,}) if test -n "$GCC" && test "$ZEND_INLINE_OPTIMIZATION" != "yes"; then Index: Zend/zend_alloc.c =================================================================== RCS file: /repository/Zend/zend_alloc.c,v retrieving revision 1.76 diff -u -r1.76 zend_alloc.c --- Zend/zend_alloc.c 2001/04/30 05:39:37 1.76 +++ Zend/zend_alloc.c 2001/05/10 11:56:24 @@ -185,6 +185,12 @@ #if MEMORY_LIMIT CHECK_MEMORY_LIMIT(size, SIZE); #endif +#if MEMORY_USAGE + AG(cur_allocated_memory) += SIZE; + if (AG(cur_allocated_memory) > AG(max_allocated_memory)) + AG(max_allocated_memory) = AG(cur_allocated_memory); +#endif + HANDLE_UNBLOCK_INTERRUPTIONS(); return (void *)((char *)p + sizeof(zend_mem_header) + MEM_HEADER_PADDING); } @@ -228,6 +234,9 @@ #if MEMORY_LIMIT AG(allocated_memory) -= SIZE; #endif +#if MEMORY_USAGE + AG(cur_allocated_memory) -= SIZE; +#endif free(p); HANDLE_UNBLOCK_INTERRUPTIONS(); @@ -305,6 +314,12 @@ #if MEMORY_LIMIT CHECK_MEMORY_LIMIT(size - p->size, SIZE - REAL_SIZE(p->size)); #endif +#if MEMORY_USAGE + AG(cur_allocated_memory) += SIZE - REAL_SIZE(p->size); + if (AG(cur_allocated_memory) > AG(max_allocated_memory)) + AG(max_allocated_memory) = AG(cur_allocated_memory); +#endif + p->size = size; HANDLE_UNBLOCK_INTERRUPTIONS(); @@ -390,6 +405,10 @@ AG(allocated_memory) = 0; AG(memory_exhausted) = 0; #endif +#if MEMORY_USAGE + AG(cur_allocated_memory) = 0; + AG(max_allocated_memory) = 0; +#endif memset(AG(fast_cache_list_head), 0, sizeof(AG(fast_cache_list_head))); memset(AG(cache_count), 0, sizeof(AG(cache_count))); @@ -487,6 +506,10 @@ } #if MEMORY_LIMIT AG(memory_exhausted)=0; +#endif +#if MEMORY_USAGE + AG(cur_allocated_memory) = 0; + AG(max_allocated_memory) = 0; #endif #if (ZEND_DEBUG) Index: Zend/zend_globals.h =================================================================== RCS file: /repository/Zend/zend_globals.h,v retrieving revision 1.61 diff -u -r1.61 zend_globals.h --- Zend/zend_globals.h 2001/02/26 05:43:26 1.61 +++ Zend/zend_globals.h 2001/05/10 11:56:24 @@ -217,6 +217,10 @@ unsigned int allocated_memory; unsigned char memory_exhausted; #endif +#if MEMORY_USAGE + unsigned int cur_allocated_memory; + unsigned int max_allocated_memory; +#endif }; #endif /* ZEND_GLOBALS_H */
-- PHP Development Mailing List <http://www.php.net/> To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] To contact the list administrators, e-mail: [EMAIL PROTECTED]