Почему изменения в моем коде не отражаются сразу? - PullRequest
3 голосов
/ 16 ноября 2011

Я поддерживаю большой сайт WordPress и пытаюсь устранить проблему, не связанную с ней, добавив в код операторы трассировки, которые являются не чем иным, как вызовом error_log (). Вкратце, мой сервер настроен как файловый сервер, который разделяет корень документа сайта через nfs. Есть 2 веб-сервера, на которых работает nginx + apc + php / fpm. Я редактирую файлы php непосредственно на файловом сервере, и когда я просматриваю файлы с веб-серверов, я вижу свои изменения, однако, когда я отслеживаю журнал ошибок, я вижу, что мои изменения не отражаются немедленно. Я продолжаю видеть старые операторы трассировки, как будто я вообще не вносил изменения.

Моя теория запуска заключается в том, что код кэшируется либо в apc (duh), либо в кеше nfs на стороне клиента (маловероятно, поскольку я вижу изменения с помощью vi). Я пытаюсь смягчить это, сбрасывая кэш apc, используя скрипт, который запускает apc_clear_cache (). Кроме того, я перезапустил nginx, а также php-fpm, надеясь, что что-то очистит старый кешированный php-код. Ни один из этих методов не сработал, и я должен подождать до часа или более, прежде чем я увижу изменения в моем коде, отраженные в журналах.

Сайт, на котором я устраняю неполадки, имеет довольно высокий трафик, поэтому перемонтирование общего ресурса nfs для меня не вариант. Я предполагаю, что кэш кода операции apc на самом деле не очищается, но я смотрел статистику с помощью apc.php, и я вижу, как выглядит кэш, перестраиваемый после того, как я запустил свой скрипт сброса. Я занимался этим пару дней, и устранение неполадок в простой проблеме превратилось в огромную головную боль. Может ли кто-нибудь предложить какие-то идеи, на которые стоит обратить внимание или попытаться сделать изменения в моем коде более быстрыми?

Ответы [ 2 ]

0 голосов
/ 28 ноября 2011

Я никогда не находил удовлетворительную причину для этой проблемы, но мы решили удалить NFS из уравнения, и наша проблема ушла. Спасибо всем за помощь.

0 голосов
/ 16 ноября 2011

Некоторые мысли:

  1. Временная установка значения apc.stat в true может быть полезной, если вы настраиваете;это означает небольшое снижение производительности, но заставит APC перепроверять opcache перед каждым запросом.

  2. Это мой метод дробовика для обновления кеша APC (принудительно делает недействительным каждый отдельный файл).

  3. Является ли FPM всегда общим кешем (похоже, в руководстве это указано);или там больше кешей?(Не уверен! Я не очень знаком с FPM).

    $info = apc_cache_info();
    $files = $info['cache_list'];
    $prefix = "/";
    if (isset($_GET['PREFIX']))
    {
        $prefix = $_GET['PREFIX'];
    }
    $user = apc_cache_info("user");
    $cachestore = array();
    // save the user cache to an array
    foreach ($user['cache_list'] as $info)
    {
        $cachestore[$info['info']] = apc_fetch($info['info']);
    }
    apc_clear_cache();
    apc_clear_cache('user');
    // Recache all the files that were in the opcache before..
    foreach ($files as $file)
    {
        if (strpos($file['filename'], $prefix) === 0)
        {
            print $file['filename'] . " : ";
            print apc_compile_file($file['filename']) ? "SUCCESS\n" : "FAILE             D\n";
        }
    }

    foreach ($cachestore as $key => $value)
    {
        apc_store($key,$value);
    }
...