Skip to content

Commit 62fe89c

Browse files
committed
opcache_is_script_cached: file_cache option
1 parent 8ac8ec4 commit 62fe89c

File tree

6 files changed

+47
-10
lines changed

6 files changed

+47
-10
lines changed

ext/opcache/ZendAccelerator.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1916,7 +1916,7 @@ static zend_op_array *file_cache_compile_file(zend_file_handle *file_handle, int
19161916

19171917
HANDLE_BLOCK_INTERRUPTIONS();
19181918
SHM_UNPROTECT();
1919-
persistent_script = zend_file_cache_script_load(file_handle);
1919+
persistent_script = zend_file_cache_script_load(file_handle, false);
19201920
SHM_PROTECT();
19211921
HANDLE_UNBLOCK_INTERRUPTIONS();
19221922
if (persistent_script) {
@@ -2133,7 +2133,7 @@ zend_op_array *persistent_compile_file(zend_file_handle *file_handle, int type)
21332133

21342134
/* Check the second level cache */
21352135
if (!persistent_script && ZCG(accel_directives).file_cache) {
2136-
persistent_script = zend_file_cache_script_load(file_handle);
2136+
persistent_script = zend_file_cache_script_load(file_handle, false);
21372137
}
21382138

21392139
/* If script was not found or invalidated by validate_timestamps */

ext/opcache/opcache.stub.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,4 @@ function opcache_jit_blacklist(Closure $closure): void {}
2222
*/
2323
function opcache_get_configuration(): array|false {}
2424

25-
function opcache_is_script_cached(string $filename): bool {}
25+
function opcache_is_script_cached(string $filename, bool $file_cache = false): bool {}

ext/opcache/opcache_arginfo.h

Lines changed: 4 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ext/opcache/zend_accelerator_module.c

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#include "zend_closures.h"
2828
#include "zend_shared_alloc.h"
2929
#include "zend_accelerator_blacklist.h"
30+
#include "zend_file_cache.h"
3031
#include "php_ini.h"
3132
#include "SAPI.h"
3233
#include "zend_virtual_cwd.h"
@@ -363,6 +364,33 @@ static int filename_is_in_cache(zend_string *filename)
363364
return 0;
364365
}
365366

367+
static int filename_is_in_file_cache(zend_string *filename)
368+
{
369+
if (!ZCG(accel_directives).file_cache) {
370+
return 0;
371+
}
372+
373+
zend_file_handle *handle;
374+
375+
zend_stream_init_filename_ex(handle, filename);
376+
377+
if (!handle->opened_path) {
378+
zend_destroy_file_handle(handle);
379+
return 0;
380+
}
381+
382+
zend_persistent_script *persistent_script = zend_file_cache_script_load(handle, true)
383+
384+
zend_destroy_file_handle(handle);
385+
386+
if (persistent_script) {
387+
return 1;
388+
}
389+
390+
return 0;
391+
}
392+
393+
366394
static int accel_file_in_cache(INTERNAL_FUNCTION_PARAMETERS)
367395
{
368396
if (ZEND_NUM_ARGS() == 1) {
@@ -983,10 +1011,11 @@ ZEND_FUNCTION(opcache_compile_file)
9831011
ZEND_FUNCTION(opcache_is_script_cached)
9841012
{
9851013
zend_string *script_name;
1014+
bool file_cache = 0;
9861015

987-
ZEND_PARSE_PARAMETERS_START(1, 1)
988-
Z_PARAM_STR(script_name)
989-
ZEND_PARSE_PARAMETERS_END();
1016+
if (zend_parse_parameters(ZEND_NUM_ARGS(), "S|b", &script_name, &file_cache) == FAILURE) {
1017+
RETURN_THROWS();
1018+
}
9901019

9911020
if (!validate_api_restriction()) {
9921021
RETURN_FALSE;
@@ -996,5 +1025,9 @@ ZEND_FUNCTION(opcache_is_script_cached)
9961025
RETURN_FALSE;
9971026
}
9981027

999-
RETURN_BOOL(filename_is_in_cache(script_name));
1028+
if (file_cache) {
1029+
RETURN_BOOL(filename_is_in_file_cache(script_name));
1030+
} else {
1031+
RETURN_BOOL(filename_is_in_cache(script_name));
1032+
}
10001033
}

ext/opcache/zend_file_cache.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1813,7 +1813,7 @@ static void zend_file_cache_unserialize(zend_persistent_script *script,
18131813
zend_file_cache_unserialize_early_bindings(script, buf);
18141814
}
18151815

1816-
zend_persistent_script *zend_file_cache_script_load(zend_file_handle *file_handle)
1816+
zend_persistent_script *zend_file_cache_script_load(zend_file_handle *file_handle, bool force_file_cache_only)
18171817
{
18181818
zend_string *full_path = file_handle->opened_path;
18191819
int fd;
@@ -1928,6 +1928,7 @@ zend_persistent_script *zend_file_cache_script_load(zend_file_handle *file_handl
19281928
}
19291929

19301930
if (!file_cache_only &&
1931+
!force_file_cache_only &&
19311932
!ZCSG(restart_in_progress) &&
19321933
!ZCSG(restart_pending) &&
19331934
!ZSMMG(memory_exhausted) &&

ext/opcache/zend_file_cache.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
#define ZEND_FILE_CACHE_H
2121

2222
int zend_file_cache_script_store(zend_persistent_script *script, bool in_shm);
23-
zend_persistent_script *zend_file_cache_script_load(zend_file_handle *file_handle);
23+
zend_persistent_script *zend_file_cache_script_load(zend_file_handle *file_handle, bool force_file_cache_only);
2424
void zend_file_cache_invalidate(zend_string *full_path);
2525

2626
#endif /* ZEND_FILE_CACHE_H */

0 commit comments

Comments
 (0)