Skip to content

Commit c78277a

Browse files
committed
Preloadsing support for opcache restart
1 parent f76a955 commit c78277a

File tree

2 files changed

+30
-5
lines changed

2 files changed

+30
-5
lines changed

ext/opcache/ZendAccelerator.c

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2421,6 +2421,17 @@ int accel_activate(INIT_FUNC_ARGS)
24212421
}
24222422

24232423
zend_shared_alloc_restore_state();
2424+
if (ZCSG(preload_script)) {
2425+
zend_accel_hash_update(&ZCSG(hash), ZSTR_VAL(ZCSG(preload_script)->script.filename), ZSTR_LEN(ZCSG(preload_script)->script.filename), 0, ZCSG(preload_script));
2426+
if (ZCSG(saved_scripts)) {
2427+
zend_persistent_script **p = ZCSG(saved_scripts);
2428+
while (*p) {
2429+
zend_accel_hash_update(&ZCSG(hash), ZSTR_VAL((*p)->script.filename), ZSTR_LEN((*p)->script.filename), 0, *p);
2430+
p++;
2431+
}
2432+
}
2433+
ZCSG(map_ptr_last) = ZCSG(saved_map_ptr_last);
2434+
}
24242435
ZCSG(accelerator_enabled) = ZCSG(cache_status_before_restart);
24252436
if (ZCSG(last_restart_time) < ZCG(request_time)) {
24262437
ZCSG(last_restart_time) = ZCG(request_time);
@@ -3616,6 +3627,7 @@ static int accel_preload(const char *config)
36163627
if (ret == SUCCESS) {
36173628
zend_persistent_script *script;
36183629
zend_string *filename;
3630+
int i;
36193631

36203632
preload_link();
36213633
preload_remove_empty_includes();
@@ -3704,13 +3716,24 @@ static int accel_preload(const char *config)
37043716
EG(persistent_classes_count) = EG(class_table)->nNumUsed;
37053717

37063718
/* Store individual scripts with unlinked classes */
3719+
HANDLE_BLOCK_INTERRUPTIONS();
3720+
SHM_UNPROTECT();
3721+
3722+
i = 0;
3723+
zend_shared_alloc_lock();
3724+
ZCSG(saved_scripts) = zend_shared_alloc((zend_hash_num_elements(preload_scripts) + 1) * sizeof(void*));
3725+
zend_shared_alloc_unlock();
37073726
ZEND_HASH_FOREACH_PTR(preload_scripts, script) {
3708-
HANDLE_BLOCK_INTERRUPTIONS();
3709-
SHM_UNPROTECT();
3710-
preload_script_in_shared_memory(script);
3711-
SHM_PROTECT();
3712-
HANDLE_UNBLOCK_INTERRUPTIONS();
3727+
ZCSG(saved_scripts)[i++] = preload_script_in_shared_memory(script);
37133728
} ZEND_HASH_FOREACH_END();
3729+
ZCSG(saved_scripts)[i] = NULL;
3730+
3731+
ZCSG(saved_map_ptr_last) = ZCSG(map_ptr_last);
3732+
zend_shared_alloc_save_state();
3733+
accel_interned_strings_save_state();
3734+
3735+
SHM_PROTECT();
3736+
HANDLE_UNBLOCK_INTERRUPTIONS();
37143737

37153738
zend_shared_alloc_destroy_xlat_table();
37163739
}

ext/opcache/ZendAccelerator.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,8 @@ typedef struct _zend_accel_shared_globals {
288288

289289
/* Preloading */
290290
zend_persistent_script *preload_script;
291+
zend_persistent_script **saved_scripts;
292+
size_t saved_map_ptr_last;
291293

292294
/* uninitialized HashTable Support */
293295
uint32_t uninitialized_bucket[-HT_MIN_MASK];

0 commit comments

Comments
 (0)