From a8c7e50f4d7d73797615734978259d640b3835c1 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 26 Nov 2013 11:34:41 +0400 Subject: [PATCH] Fixed bug #65559 (Opcache: cache not cleared if changes occur while running) --- NEWS | 2 ++ ext/opcache/README | 6 ++++++ ext/opcache/ZendAccelerator.c | 11 ++++++++++- ext/opcache/ZendAccelerator.h | 1 + ext/opcache/zend_accelerator_module.c | 3 ++- run-tests.php | 1 + 6 files changed, 22 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index e8ab470d5a..571de403dd 100644 --- a/NEWS +++ b/NEWS @@ -13,6 +13,8 @@ PHP NEWS - OPCache . Fixed bug #65915 (Inconsistent results with require return value). (Dmitry) + . Fixed bug #65559 (Opcache: cache not cleared if changes occur while + running). (Dmitry) - readline . Fixed Bug #65714 (PHP cli forces the tty to cooked mode). (Remi) diff --git a/ext/opcache/README b/ext/opcache/README index 2e30d92c00..cb6ac342c4 100644 --- a/ext/opcache/README +++ b/ext/opcache/README @@ -103,6 +103,12 @@ opcache.revalidate_freq (default "2") memory storage allocation. ("1" means validate once per second, but only once per request. "0" means always validate) +opcache.file_update_protection (default "2") + Prevents caching files that are less than this number of seconds old. + It protects from caching of incompletely updated files. In case all file + updates on your site are atomic, you may increase performance setting it + to "0". + opcache.revalidate_path (default "0") Enables or disables file search in include_path optimization If the file search is disabled and a cached file is found that uses diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c index 8eaa0a3778..b2efce9ea2 100644 --- a/ext/opcache/ZendAccelerator.c +++ b/ext/opcache/ZendAccelerator.c @@ -1331,7 +1331,9 @@ 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) { + if (ZCG(accel_directives).validate_timestamps || + ZCG(accel_directives).file_update_protection || + ZCG(accel_directives).max_file_size > 0) { size_t size = 0; /* Obtain the file timestamps, *before* actually compiling them, @@ -1347,6 +1349,13 @@ static zend_persistent_script *compile_and_cache_file(zend_file_handle *file_han return NULL; } + /* check if file is too new (may be it's not written completely yet) */ + if (ZCG(accel_directives).file_update_protection && + (ZCG(request_time) - ZCG(accel_directives).file_update_protection < timestamp)) { + *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); diff --git a/ext/opcache/ZendAccelerator.h b/ext/opcache/ZendAccelerator.h index b9d7ef3470..cbc50d2b71 100644 --- a/ext/opcache/ZendAccelerator.h +++ b/ext/opcache/ZendAccelerator.h @@ -229,6 +229,7 @@ typedef struct _zend_accel_directives { zend_bool inherited_hack; zend_bool enable_cli; unsigned long revalidate_freq; + unsigned long file_update_protection; char *error_log; #ifdef ZEND_WIN32 char *mmap_base; diff --git a/ext/opcache/zend_accelerator_module.c b/ext/opcache/zend_accelerator_module.c index 0914fb68dd..c3df1a68f7 100644 --- a/ext/opcache/zend_accelerator_module.c +++ b/ext/opcache/zend_accelerator_module.c @@ -259,7 +259,8 @@ ZEND_INI_BEGIN() STD_PHP_INI_ENTRY("opcache.consistency_checks" , "0" , PHP_INI_ALL , OnUpdateLong, accel_directives.consistency_checks, zend_accel_globals, accel_globals) STD_PHP_INI_ENTRY("opcache.force_restart_timeout" , "180" , PHP_INI_SYSTEM, OnUpdateLong, accel_directives.force_restart_timeout, zend_accel_globals, accel_globals) STD_PHP_INI_ENTRY("opcache.revalidate_freq" , "2" , PHP_INI_ALL , OnUpdateLong, accel_directives.revalidate_freq, zend_accel_globals, accel_globals) - STD_PHP_INI_ENTRY("opcache.preferred_memory_model", "" , PHP_INI_SYSTEM, OnUpdateStringUnempty, accel_directives.memory_model, zend_accel_globals, accel_globals) + STD_PHP_INI_ENTRY("opcache.file_update_protection", "2" , PHP_INI_ALL , OnUpdateLong, accel_directives.file_update_protection, zend_accel_globals, accel_globals) + STD_PHP_INI_ENTRY("opcache.preferred_memory_model", "" , PHP_INI_SYSTEM, OnUpdateStringUnempty, accel_directives.memory_model, zend_accel_globals, accel_globals) STD_PHP_INI_ENTRY("opcache.blacklist_filename" , "" , PHP_INI_SYSTEM, OnUpdateString, accel_directives.user_blacklist_filename, zend_accel_globals, accel_globals) STD_PHP_INI_ENTRY("opcache.max_file_size" , "0" , PHP_INI_SYSTEM, OnUpdateLong, accel_directives.max_file_size, zend_accel_globals, accel_globals) diff --git a/run-tests.php b/run-tests.php index a88d37d000..d53c3b6c5e 100755 --- a/run-tests.php +++ b/run-tests.php @@ -241,6 +241,7 @@ $ini_overwrites = array( 'precision=14', 'memory_limit=128M', 'opcache.fast_shutdown=0', + 'opcache.file_update_protection=0', ); function write_information($show_html) -- 2.40.0