Commit:    08bfdc75a4c6656192706cd153fc28ab89a821bc
Author:    Dmitry Stogov <dmi...@zend.com>         Wed, 6 Mar 2013 09:41:59 
+0400
Parents:   bfb8b9153b752e5ed22ed2a621c5dc9f77df008d
Branches:  PHP-5.5 master

Link:       
http://git.php.net/?p=php-src.git;a=commitdiff;h=08bfdc75a4c6656192706cd153fc28ab89a821bc

Log:
Allows exclusion of large files from being cached

Changed paths:
  M  README
  M  ZendAccelerator.c
  M  ZendAccelerator.h
  M  zend_accelerator_module.c

diff --git a/README b/README
index b44386e..c0304a7 100644
--- a/README
+++ b/README
@@ -159,6 +159,10 @@ zend_optimizerplus.blacklist_filename
           compile time evaluation.
        3) Code that triggers an Optimizer+ bug.
 
+zend_optimizerplus.max_file_size (default "0")
+       Allows exclusion of large files from being cached. By default all files
+       are cached.
+
 zend_optimizerplus.consistency_checks (default "0")
        Check the cache checksum each N requests.
        The default value of "0" means that the checks are disabled.
diff --git a/ZendAccelerator.c b/ZendAccelerator.c
index 06469f5..ed94226 100644
--- a/ZendAccelerator.c
+++ b/ZendAccelerator.c
@@ -654,7 +654,7 @@ static int zend_get_stream_timestamp(const char *filename, 
struct stat *statbuf
 }
 
 #if ZEND_WIN32
-static accel_time_t zend_get_file_handle_timestamp_win(zend_file_handle 
*file_handle)
+static accel_time_t zend_get_file_handle_timestamp_win(zend_file_handle 
*file_handle, size_t *size)
 {
        static unsigned __int64 utc_base = 0;
        static FILETIME utc_base_ft;
@@ -689,13 +689,16 @@ static accel_time_t 
zend_get_file_handle_timestamp_win(zend_file_handle *file_ha
                ftime = (((unsigned 
__int64)fdata.ftLastWriteTime.dwHighDateTime) << 32) + 
fdata.ftLastWriteTime.dwLowDateTime - utc_base;
                ftime /= 10000000L;
 
+               if (size) {
+                       *size = (size_t)(((unsigned 
__int64)fdata.nFileSizeHigh) << 32 + (unsigned __int64)fdata.nFileSizeLow);
+               }
                return (accel_time_t)ftime;
        }
        return 0;
 }
 #endif
 
-static accel_time_t zend_get_file_handle_timestamp(zend_file_handle 
*file_handle TSRMLS_DC)
+static accel_time_t zend_get_file_handle_timestamp(zend_file_handle 
*file_handle, size_t *size TSRMLS_DC)
 {
        struct stat statbuf;
 #ifdef ZEND_WIN32
@@ -709,12 +712,15 @@ static accel_time_t 
zend_get_file_handle_timestamp(zend_file_handle *file_handle
                struct stat *tmpbuf = sapi_module.get_stat(TSRMLS_C);
 
                if (tmpbuf) {
+                       if (size) {
+                               *size = tmpbuf->st_size;
+                       }
                        return tmpbuf->st_mtime;
                }
        }
 
 #ifdef ZEND_WIN32
-       res = zend_get_file_handle_timestamp_win(file_handle);
+       res = zend_get_file_handle_timestamp_win(file_handle, size);
        if (res) {
                return res;
        }
@@ -788,6 +794,9 @@ static accel_time_t 
zend_get_file_handle_timestamp(zend_file_handle *file_handle
                        return 0;
        }
 
+       if (size) {
+               *size = statbuf.st_size;
+       }
        return statbuf.st_mtime;
 }
 
@@ -820,7 +829,7 @@ static inline int 
do_validate_timestamps(zend_persistent_script *persistent_scri
                return FAILURE;
        }
 
-       if (zend_get_file_handle_timestamp(file_handle TSRMLS_CC) == 
persistent_script->timestamp) {
+       if (zend_get_file_handle_timestamp(file_handle, NULL TSRMLS_CC) == 
persistent_script->timestamp) {
                if (full_path_ptr) {
                        file_handle->opened_path = NULL;
                }
@@ -834,7 +843,7 @@ static inline int 
do_validate_timestamps(zend_persistent_script *persistent_scri
        ps_handle.filename = persistent_script->full_path;
        ps_handle.opened_path = persistent_script->full_path;
 
-       if (zend_get_file_handle_timestamp(&ps_handle TSRMLS_CC) == 
persistent_script->timestamp) {
+       if (zend_get_file_handle_timestamp(&ps_handle, NULL TSRMLS_CC) == 
persistent_script->timestamp) {
                return SUCCESS;
        }
 
@@ -1178,6 +1187,7 @@ static zend_persistent_script 
*compile_and_cache_file(zend_file_handle *file_han
        zval *orig_user_error_handler;
        zend_op_array *op_array;
        int do_bailout = 0;
+       accel_time_t timestamp = 0;
 #if ZEND_EXTENSION_API_NO >= PHP_5_3_X_API_NO
        zend_uint orig_compiler_options = 0;
 #endif
@@ -1211,7 +1221,7 @@ static zend_persistent_script 
*compile_and_cache_file(zend_file_handle *file_han
 #if ZEND_EXTENSION_API_NO >= PHP_5_3_X_API_NO
        if (file_handle->type == ZEND_HANDLE_STREAM) {
                char *buf;
-               size_t size, offset = 0;
+               size_t size;
 
                /* Stream callbacks needs to be called in context of original
                 * function and class tables (see: 
https://bugs.php.net/bug.php?id=64353)
@@ -1223,6 +1233,29 @@ static zend_persistent_script 
*compile_and_cache_file(zend_file_handle *file_han
        }
 #endif
 
+       if (ZCG(accel_directives).validate_timestamps || 
ZCG(accel_directives).max_file_size > 0) {
+               size_t size = 0;
+
+               /* Obtain the file timestamps, *before* actually compiling them,
+                * otherwise we have a race-condition.
+                */
+               timestamp = zend_get_file_handle_timestamp(file_handle, 
ZCG(accel_directives).max_file_size > 0 ? &size : NULL TSRMLS_CC);
+
+               /* If we can't obtain a timestamp (that means file is possibly 
socket)
+                *  we won't cache it
+                */
+               if (timestamp == 0) {
+                       *op_array_p = 
accelerator_orig_compile_file(file_handle, type TSRMLS_CC);
+                       return NULL;
+               }
+
+               if (ZCG(accel_directives).max_file_size > 0 && size > 
(size_t)ZCG(accel_directives).max_file_size) {
+                       ZCSG(blacklist_misses)++;
+                       *op_array_p = 
accelerator_orig_compile_file(file_handle, type TSRMLS_CC);
+                       return NULL;
+               }
+       }
+
        new_persistent_script = create_persistent_script();
 
        /* Save the original values for the op_array, function table and class 
table */
@@ -1295,14 +1328,7 @@ static zend_persistent_script 
*compile_and_cache_file(zend_file_handle *file_han
                /* Obtain the file timestamps, *before* actually compiling them,
                 * otherwise we have a race-condition.
                 */
-               new_persistent_script->timestamp = 
zend_get_file_handle_timestamp(file_handle TSRMLS_CC);
-
-               /* If we can't obtain a timestamp (that means file is possibly 
socket)
-                *  we return it but do not persist it
-                */
-               if (new_persistent_script->timestamp == 0) {
-                       return new_persistent_script;
-               }
+               new_persistent_script->timestamp = timestamp;
                new_persistent_script->dynamic_members.revalidate = 
ZCSG(revalidate_at);
        }
 
diff --git a/ZendAccelerator.h b/ZendAccelerator.h
index 268d86f..310605b 100644
--- a/ZendAccelerator.h
+++ b/ZendAccelerator.h
@@ -219,6 +219,7 @@ typedef struct _zend_accel_directives {
        long           log_verbosity_level;
 
        long           optimization_level;
+       long           max_file_size;
 #if ZEND_EXTENSION_API_NO > PHP_5_3_X_API_NO
        long           interned_strings_buffer;
 #endif
diff --git a/zend_accelerator_module.c b/zend_accelerator_module.c
index 1bf16e5..5f7c32b 100644
--- a/zend_accelerator_module.c
+++ b/zend_accelerator_module.c
@@ -218,6 +218,7 @@ ZEND_INI_BEGIN()
        STD_PHP_INI_ENTRY("zend_optimizerplus.revalidate_freq"       , "2"   , 
PHP_INI_ALL   , OnUpdateLong,                 accel_directives.revalidate_freq, 
          zend_accel_globals, accel_globals)
        STD_PHP_INI_ENTRY("zend_optimizerplus.preferred_memory_model", ""    , 
PHP_INI_SYSTEM, OnUpdateStringUnempty,        accel_directives.memory_model,    
          zend_accel_globals, accel_globals)
        STD_PHP_INI_ENTRY("zend_optimizerplus.blacklist_filename"    , ""    , 
PHP_INI_SYSTEM, OnUpdateAccelBlacklist,       
accel_directives.user_blacklist_filename,   zend_accel_globals, accel_globals)
+       STD_PHP_INI_ENTRY("zend_optimizerplus.max_file_size"         , "0"   , 
PHP_INI_SYSTEM, OnUpdateLong,                 accel_directives.max_file_size,   
          zend_accel_globals, accel_globals)
 
        STD_PHP_INI_ENTRY("zend_optimizerplus.protect_memory"        , "0"  , 
PHP_INI_SYSTEM, OnUpdateBool,                  accel_directives.protect_memory, 
           zend_accel_globals, accel_globals)
        STD_PHP_INI_ENTRY("zend_optimizerplus.save_comments"         , "1"  , 
PHP_INI_SYSTEM, OnUpdateBool,                  accel_directives.save_comments,  
           zend_accel_globals, accel_globals)
@@ -554,6 +555,7 @@ static ZEND_FUNCTION(accelerator_get_configuration)
        add_assoc_long(directives,       "zend_optimizerplus.revalidate_freq",  
      ZCG(accel_directives).revalidate_freq);
        add_assoc_string(directives, 
"zend_optimizerplus.preferred_memory_model", 
STRING_NOT_NULL(ZCG(accel_directives).memory_model), 1);
        add_assoc_string(directives, "zend_optimizerplus.blacklist_filename",   
  STRING_NOT_NULL(ZCG(accel_directives).user_blacklist_filename), 1);
+       add_assoc_long(directives,   "zend_optimizerplus.max_file_size",        
  ZCG(accel_directives).max_file_size);
        add_assoc_string(directives, "zend_optimizerplus.error_log",            
  STRING_NOT_NULL(ZCG(accel_directives).error_log), 1);
 
        add_assoc_bool(directives,   "zend_optimizerplus.protect_memory",       
  ZCG(accel_directives).protect_memory);
-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to