summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2013-12-23 12:50:42 +0400
committerDmitry Stogov <dmitry@zend.com>2013-12-23 12:50:42 +0400
commitf5c200fce984e5f16677c7fa25a755f10a47eb07 (patch)
tree9066c863f87aec58cee4867494d701d966eed1d4
parentee55edf5e41b695f781d36a808664e42d6a3dcd0 (diff)
parent0dcaf0f445a4084f3dbb37411b6acead4658c5f5 (diff)
downloadphp-git-f5c200fce984e5f16677c7fa25a755f10a47eb07.tar.gz
Merge branch 'PHP-5.5' into PHP-5.6
* PHP-5.5: Fixed Issue #140: "opcache.enable_file_override" doesn't respect "opcache.revalidate_freq" opcodes
-rw-r--r--ext/opcache/ZendAccelerator.c2
-rw-r--r--ext/opcache/ZendAccelerator.h1
-rw-r--r--ext/opcache/tests/issue0140.phpt43
-rw-r--r--ext/opcache/zend_accelerator_module.c6
4 files changed, 49 insertions, 3 deletions
diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c
index 1850bb3f19..ac6ee1e0bd 100644
--- a/ext/opcache/ZendAccelerator.c
+++ b/ext/opcache/ZendAccelerator.c
@@ -877,7 +877,7 @@ static inline int do_validate_timestamps(zend_persistent_script *persistent_scri
return FAILURE;
}
-static inline int validate_timestamp_and_record(zend_persistent_script *persistent_script, zend_file_handle *file_handle TSRMLS_DC)
+int validate_timestamp_and_record(zend_persistent_script *persistent_script, zend_file_handle *file_handle TSRMLS_DC)
{
if (ZCG(accel_directives).revalidate_freq &&
(persistent_script->dynamic_members.revalidate >= ZCSG(revalidate_at))) {
diff --git a/ext/opcache/ZendAccelerator.h b/ext/opcache/ZendAccelerator.h
index 487010ba27..bd197fb401 100644
--- a/ext/opcache/ZendAccelerator.h
+++ b/ext/opcache/ZendAccelerator.h
@@ -330,6 +330,7 @@ extern char *zps_api_failure_reason;
void accel_shutdown(TSRMLS_D);
void zend_accel_schedule_restart(zend_accel_restart_reason reason TSRMLS_DC);
void zend_accel_schedule_restart_if_necessary(zend_accel_restart_reason reason TSRMLS_DC);
+int validate_timestamp_and_record(zend_persistent_script *persistent_script, zend_file_handle *file_handle TSRMLS_DC);
int zend_accel_invalidate(const char *filename, int filename_len, zend_bool force TSRMLS_DC);
int zend_accel_script_optimize(zend_persistent_script *persistent_script TSRMLS_DC);
int accelerator_shm_read_lock(TSRMLS_D);
diff --git a/ext/opcache/tests/issue0140.phpt b/ext/opcache/tests/issue0140.phpt
new file mode 100644
index 0000000000..7c0d6b92b3
--- /dev/null
+++ b/ext/opcache/tests/issue0140.phpt
@@ -0,0 +1,43 @@
+--TEST--
+Issue #140: "opcache.enable_file_override" doesn't respect "opcache.revalidate_freq"
+--INI--
+opcache.enable=1
+opcache.enable_cli=1
+opcache.revalidate_freq=0
+opcache.file_update_protection=0
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+<?php if (php_sapi_name() != "cli") die("skip CLI only"); ?>
+--FILE--
+<?php
+define("FILENAME", dirname(__FILE__) . "/issuer0140.inc.php");
+file_put_contents(FILENAME, "1\n");
+
+var_dump(is_readable(FILENAME));
+include(FILENAME);
+var_dump(filemtime(FILENAME));
+
+sleep(2);
+file_put_contents(FILENAME, "2\n");
+
+var_dump(is_readable(FILENAME));
+include(FILENAME);
+var_dump(filemtime(FILENAME));
+
+sleep(2);
+unlink(FILENAME);
+
+var_dump(is_readable(FILENAME));
+var_dump(@include(FILENAME));
+var_dump(@filemtime(FILENAME));
+?>
+--EXPECTF--
+bool(true)
+1
+int(%d)
+bool(true)
+2
+int(%d)
+bool(false)
+bool(false)
+bool(false)
diff --git a/ext/opcache/zend_accelerator_module.c b/ext/opcache/zend_accelerator_module.c
index cd840fd7dd..7596e92bbb 100644
--- a/ext/opcache/zend_accelerator_module.c
+++ b/ext/opcache/zend_accelerator_module.c
@@ -313,13 +313,15 @@ static int filename_is_in_cache(char *filename, int filename_len TSRMLS_DC)
if (IS_ABSOLUTE_PATH(filename, filename_len)) {
persistent_script = zend_accel_hash_find(&ZCSG(hash), filename, filename_len + 1);
if (persistent_script) {
- return !persistent_script->corrupted;
+ return !persistent_script->corrupted &&
+ validate_timestamp_and_record(persistent_script, &handle TSRMLS_CC) == SUCCESS;
}
}
if ((key = accel_make_persistent_key_ex(&handle, filename_len, &key_length TSRMLS_CC)) != NULL) {
persistent_script = zend_accel_hash_find(&ZCSG(hash), key, key_length + 1);
- return persistent_script && !persistent_script->corrupted;
+ return persistent_script && !persistent_script->corrupted &&
+ validate_timestamp_and_record(persistent_script, &handle TSRMLS_CC) == SUCCESS;
}
return 0;