Skip to content

Commit 457eae7

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

File tree

3 files changed

+22
-9
lines changed

3 files changed

+22
-9
lines changed

UPGRADING

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,9 +105,12 @@ 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+
Note: this cache isn't portable between PHP builds, enforced by the
112+
inclusion of the `zend_system_id` both in the directory path, and
113+
each cache file.
111114

112115
========================================
113116
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: 16 additions & 5 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,21 +1859,26 @@ 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
}
18721878

18731879
/* verify timestamp */
18741880
if (ZCG(accel_directives).validate_timestamps &&
1881+
!ZCG(accel_directives).file_cache_read_only
18751882
zend_get_file_handle_timestamp(file_handle, NULL) != info.timestamp) {
18761883
if (zend_file_cache_flock(fd, LOCK_UN) != 0) {
18771884
zend_accel_error(ACCEL_LOG_WARNING, "opcache cannot unlock file '%s'\n", filename);
@@ -1895,7 +1902,9 @@ zend_persistent_script *zend_file_cache_script_load(zend_file_handle *file_handl
18951902
zend_accel_error(ACCEL_LOG_WARNING, "opcache cannot read from file '%s' (mem)\n", filename);
18961903
zend_file_cache_flock(fd, LOCK_UN);
18971904
close(fd);
1898-
zend_file_cache_unlink(filename);
1905+
if (!ZCG(accel_directives).file_cache_read_only) {
1906+
zend_file_cache_unlink(filename);
1907+
}
18991908
zend_arena_release(&CG(arena), checkpoint);
19001909
efree(filename);
19011910
return NULL;
@@ -1909,7 +1918,9 @@ zend_persistent_script *zend_file_cache_script_load(zend_file_handle *file_handl
19091918
if (ZCG(accel_directives).file_cache_consistency_checks &&
19101919
(actual_checksum = zend_adler32(ADLER32_INIT, mem, info.mem_size + info.str_size)) != info.checksum) {
19111920
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);
1921+
if (!ZCG(accel_directives).file_cache_read_only) {
1922+
zend_file_cache_unlink(filename);
1923+
}
19131924
zend_arena_release(&CG(arena), checkpoint);
19141925
efree(filename);
19151926
return NULL;

0 commit comments

Comments
 (0)