Когда именно PHP 5.5+ Opcache проверяет временную метку файла на основе параметра revalidate_freq

Извинения за это спрашивали раньше/в другом месте, но я не могу найти ответ.

У нас есть некоторые проблемы в течение минуты после развертывания, и мы думаем, что они связаны с Opcache. В нашей живой установке у нас есть следующие настройки Opcache:

opcache.revalidate_freq=60
opcache.validate_timestamps=1

Что из перечисленного делает PHP?

  1. Когда PHP нужен файл, проверяет ли он в этот момент, прошло ли 60 секунд с тех пор, как он в последний раз сгенерировал новый кеш файла, и если он был больше, то сгенерировал новый для этого запроса?

  2. Или он работает на каком-то таймере (или чем-то еще), где 60 секунд не связаны с тем, когда файл в последний раз был нужен?

Я бы ожидал вариант 1, но это не объяснило бы наши 60 секунд или около того проблем, поскольку путь к файлу для файлов отличается, поскольку мы каждый раз развертываем в чередующийся каталог A или B.

Надеюсь это имеет смысл? Спасибо за вашу помощь.


person Luke Cousins    schedule 03.09.2014    source источник


Ответы (2)


Итак, из руководства по PHP

Как часто проверять временные метки скрипта на наличие обновлений в секундах. 0 приведет к тому, что OPcache будет проверять наличие обновлений при каждом запросе.

Итак, вы обновляете файл, но ваша директива говорит, что между моментом обновления файла и моментом, когда opcache создает новый код операции, проходит до 60 секунд.

У validate_timestamps есть ответ. Поскольку вы хотите вручную перепроверить файл, вы можете сделать это

Когда эта директива отключена, вы должны сбросить OPcache вручную с помощью opcache_reset(), opcache_invalidate() или путем перезапуска веб-сервера, чтобы изменения в файловой системе вступили в силу.

person Machavity♦    schedule 03.09.2014
comment
Фраза, которую вы процитировали, на самом деле не отвечает на вопрос ОП. - person Tomasz P. Szynalski; 26.01.2019

Основываясь на моем анализе исходного кода 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