Основываясь на моем анализе исходного кода PHP, происходит что-то похожее на вариант 1. Когда PHP нужен файл, он проверяет, прошло ли opcache.revalidate_freq
секунд с момента последней компиляции или повторной проверки файла. Если нет, повторная проверка (проверка метки времени) пропускается.
Другими словами, параметр opcache.revalidate_freq
указывает максимальную частоту проверки меток времени. Файл не будет повторно проверен до тех пор, пока он не будет запрошен, даже если с момента последней повторной проверки прошел год.
Источник
Вот C-функция в ZendAccelerator .c, который обрабатывает проверку кеша:
int validate_timestamp_and_record(zend_persistent_script *persistent_script, zend_file_handle *file_handle)
{
if (persistent_script->timestamp == 0) {
return SUCCESS; /* Don't check timestamps of preloaded scripts */
} else if (ZCG(accel_directives).revalidate_freq &&
persistent_script->dynamic_members.revalidate >= ZCG(request_time)) {
return SUCCESS;
} else if (do_validate_timestamps(persistent_script, file_handle) == FAILURE) {
return FAILURE;
} else {
persistent_script->dynamic_members.revalidate = ZCG(request_time) + ZCG(accel_directives).revalidate_freq;
return SUCCESS;
}
}
Когда сценарий успешно перепроверен, то есть когда PHP проверяет отметку времени файла и видит, что она не изменилась с момента помещения файла в кеш, он пометит файл как «свежий» еще на opcache.revalidate_freq
секунды (.revalidate
имущество). Это предотвратит дальнейшие проверки временных меток в этот период времени (PHP будет считать, что файл свежий).
Если повторная проверка не удалась, т. е. временная метка новее, чем та, что находится в кеше, это приводит к перекомпиляции, которая также устанавливает то же свойство .revalidate
(это не показано в приведенном выше коде), снова освобождая файл от повторной проверки для того же период.
Вышеуказанная функция вызывается только из persistent_compile_file()
— функция, которая вызывается всякий раз, когда выполняется скрипт. Я не смог найти никаких других ссылок на него, которые указывали бы на использование другого триггера, такого как таймер.
person
Tomasz P. Szynalski
schedule
26.01.2019