Skip to content

Commit 8aaa51d

Browse files
committed
opcache: file_cache_read_only code review update 5 (#16484)
1 parent 8c43a77 commit 8aaa51d

File tree

3 files changed

+26
-10
lines changed

3 files changed

+26
-10
lines changed

UPGRADING

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,9 +105,14 @@ PHP 8.5 UPGRADE NOTES
105105
readline_callback_handler_install() have been changed to true, rather
106106
than bool.
107107

108-
- opcache:
108+
- Opcache:
109109
. Introduce opcache.file_cache_read_only to support a read-only
110110
opcache.file_cache directory, for use with read-only Docker containers.
111+
Best used with `opcache.validate_timestamps=0`, `opcache.revalidate_freq=0`
112+
and `opcache.enable_file_override=1`.
113+
Note: this cache isn't portable between PHP builds, enforced by the
114+
inclusion of the `zend_system_id` both in the directory path, and
115+
each cache file.
111116

112117
========================================
113118
10. New Global Constants

ext/opcache/ZendAccelerator.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1411,10 +1411,9 @@ zend_result zend_accel_invalidate(zend_string *filename, bool force)
14111411
}
14121412

14131413
if (ZCG(accel_directives).file_cache) {
1414-
if (ZCG(accel_directives).file_cache_read_only) {
1415-
return FAILURE;
1414+
if (!ZCG(accel_directives).file_cache_read_only) {
1415+
zend_file_cache_invalidate(realpath);
14161416
}
1417-
zend_file_cache_invalidate(realpath);
14181417
}
14191418

14201419
persistent_script = zend_accel_hash_find(&ZCSG(hash), realpath);

ext/opcache/zend_file_cache.c

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1847,7 +1847,9 @@ zend_persistent_script *zend_file_cache_script_load(zend_file_handle *file_handl
18471847
zend_accel_error(ACCEL_LOG_WARNING, "opcache cannot read from file '%s' (info)\n", filename);
18481848
zend_file_cache_flock(fd, LOCK_UN);
18491849
close(fd);
1850-
zend_file_cache_unlink(filename);
1850+
if (!ZCG(accel_directives).file_cache_read_only) {
1851+
zend_file_cache_unlink(filename);
1852+
}
18511853
efree(filename);
18521854
return NULL;
18531855
}
@@ -1857,15 +1859,19 @@ zend_persistent_script *zend_file_cache_script_load(zend_file_handle *file_handl
18571859
zend_accel_error(ACCEL_LOG_WARNING, "opcache cannot read from file '%s' (wrong header)\n", filename);
18581860
zend_file_cache_flock(fd, LOCK_UN);
18591861
close(fd);
1860-
zend_file_cache_unlink(filename);
1862+
if (!ZCG(accel_directives).file_cache_read_only) {
1863+
zend_file_cache_unlink(filename);
1864+
}
18611865
efree(filename);
18621866
return NULL;
18631867
}
18641868
if (memcmp(info.system_id, zend_system_id, 32) != 0) {
18651869
zend_accel_error(ACCEL_LOG_WARNING, "opcache cannot read from file '%s' (wrong \"system_id\")\n", filename);
18661870
zend_file_cache_flock(fd, LOCK_UN);
18671871
close(fd);
1868-
zend_file_cache_unlink(filename);
1872+
if (!ZCG(accel_directives).file_cache_read_only) {
1873+
zend_file_cache_unlink(filename);
1874+
}
18691875
efree(filename);
18701876
return NULL;
18711877
}
@@ -1877,7 +1883,9 @@ zend_persistent_script *zend_file_cache_script_load(zend_file_handle *file_handl
18771883
zend_accel_error(ACCEL_LOG_WARNING, "opcache cannot unlock file '%s'\n", filename);
18781884
}
18791885
close(fd);
1880-
zend_file_cache_unlink(filename);
1886+
if (!ZCG(accel_directives).file_cache_read_only) {
1887+
zend_file_cache_unlink(filename);
1888+
}
18811889
efree(filename);
18821890
return NULL;
18831891
}
@@ -1895,7 +1903,9 @@ zend_persistent_script *zend_file_cache_script_load(zend_file_handle *file_handl
18951903
zend_accel_error(ACCEL_LOG_WARNING, "opcache cannot read from file '%s' (mem)\n", filename);
18961904
zend_file_cache_flock(fd, LOCK_UN);
18971905
close(fd);
1898-
zend_file_cache_unlink(filename);
1906+
if (!ZCG(accel_directives).file_cache_read_only) {
1907+
zend_file_cache_unlink(filename);
1908+
}
18991909
zend_arena_release(&CG(arena), checkpoint);
19001910
efree(filename);
19011911
return NULL;
@@ -1909,7 +1919,9 @@ zend_persistent_script *zend_file_cache_script_load(zend_file_handle *file_handl
19091919
if (ZCG(accel_directives).file_cache_consistency_checks &&
19101920
(actual_checksum = zend_adler32(ADLER32_INIT, mem, info.mem_size + info.str_size)) != info.checksum) {
19111921
zend_accel_error(ACCEL_LOG_WARNING, "corrupted file '%s' excepted checksum: 0x%08x actual checksum: 0x%08x\n", filename, info.checksum, actual_checksum);
1912-
zend_file_cache_unlink(filename);
1922+
if (!ZCG(accel_directives).file_cache_read_only) {
1923+
zend_file_cache_unlink(filename);
1924+
}
19131925
zend_arena_release(&CG(arena), checkpoint);
19141926
efree(filename);
19151927
return NULL;

0 commit comments

Comments
 (0)