Browse Source

Merge branch 'PHP-5.5' into PHP-5.6

* PHP-5.5:
  Fixed reavlidate_path=1 behavior to avoid caching of symlinks values.

Conflicts:
	NEWS
pull/550/head
Dmitry Stogov 13 years ago
parent
commit
436ca2d019
  1. 7
      ext/opcache/ZendAccelerator.c
  2. 61
      ext/opcache/tests/revalidate_path_01.phpt

7
ext/opcache/ZendAccelerator.c

@ -1157,8 +1157,9 @@ static zend_persistent_script *cache_script_in_shared_memory(zend_persistent_scr
zend_persistent_script *existing_persistent_script = (zend_persistent_script *)bucket->data;
if (!existing_persistent_script->corrupted) {
if (!ZCG(accel_directives).validate_timestamps ||
(new_persistent_script->timestamp == existing_persistent_script->timestamp)) {
if (!ZCG(accel_directives).revalidate_path &&
(!ZCG(accel_directives).validate_timestamps ||
(new_persistent_script->timestamp == existing_persistent_script->timestamp))) {
zend_accel_add_key(key, key_length, bucket TSRMLS_CC);
}
zend_shared_alloc_unlock(TSRMLS_C);
@ -1199,7 +1200,7 @@ static zend_persistent_script *cache_script_in_shared_memory(zend_persistent_scr
/* store script structure in the hash table */
bucket = zend_accel_hash_update(&ZCSG(hash), new_persistent_script->full_path, new_persistent_script->full_path_len + 1, 0, new_persistent_script);
if (bucket &&
if (bucket && !ZCG(accel_directives).revalidate_path &&
/* key may contain non-persistent PHAR aliases (see issues #115 and #149) */
memcmp(key, "phar://", sizeof("phar://") - 1) != 0 &&
(new_persistent_script->full_path_len != key_length ||

61
ext/opcache/tests/revalidate_path_01.phpt

@ -0,0 +1,61 @@
--TEST--
revalidate_path 01: OPCache must cache only resolved real paths when revalidate_path is set
--INI--
opcache.enable=1
opcache.enable_cli=1
opcache.revalidate_path=1
--SKIPIF--
<?php require_once('skipif.inc'); ?>
<?php if (php_sapi_name() != "cli") die("skip CLI only"); ?>
--FILE--
<?php
$dir = dirname(__FILE__);
$dir1 = "$dir/test1";
$dir2 = "$dir/test2";
$link = "$dir/test";
$file1 = "$dir1/index.php";
$file2 = "$dir2/index.php";
$main = "$dir/main.php";
@mkdir($dir1);
@mkdir($dir2);
@file_put_contents($main, '<?php include(\'' . $link .'/index.php\');');
@file_put_contents($file1, "TEST 1\n");
@file_put_contents($file2, "TEST 2\n");
while (filemtime($file1) != filemtime($file2)) {
touch($file1);
touch($file2);
}
@unlink($link);
@symlink($dir1, $link);
include "php_cli_server.inc";
//php_cli_server_start('-d opcache.enable=1 -d opcache.enable_cli=1 -d opcache.revalidate_path=1');
php_cli_server_start('-d opcache.enable=1 -d opcache.enable_cli=1 -d opcache.revalidate_path=1 -d opcache.file_update_protection=0 -d realpath_cache_size=0');
echo file_get_contents('http://' . PHP_CLI_SERVER_ADDRESS . '/main.php');
echo file_get_contents('http://' . PHP_CLI_SERVER_ADDRESS . '/main.php');
@unlink($link);
@symlink($dir2, $link);
echo file_get_contents('http://' . PHP_CLI_SERVER_ADDRESS . '/main.php');
echo file_get_contents('http://' . PHP_CLI_SERVER_ADDRESS . '/main.php');
?>
--CLEAN--
<?php
$dir = dirname(__FILE__);
$dir1 = "$dir/test1";
$dir2 = "$dir/test2";
$link = "$dir/test";
$file1 = "$dir1/index.php";
$file2 = "$dir2/index.php";
$main = "$dir/main.php";
@unlink($main);
@unlink($link);
@unlink($file1);
@unlink($file2);
@rmdir($dir1);
@rmdir($dir2);
?>
--EXPECT--
TEST 1
TEST 1
TEST 2
TEST 2
Loading…
Cancel
Save