Почему изменения в моем коде не отражаются сразу?

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

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

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


person sphoid    schedule 15.11.2011    source источник
comment
Почему вы редактируете файлы непосредственно на производственном сервере с высокой посещаемостью?   -  person GolezTrol    schedule 16.11.2011
comment
Поскольку проблема, которую я устраняю, возникает не в среде песочницы, а только на рабочем сервере.   -  person sphoid    schedule 16.11.2011
comment
Итак, вы очищаете кеш apc и перезапускаете nginx на обоих веб-серверах... Возможно, вы сможете сузить область поиска, вставив невидимый HTML-код в свой PHP. например <!--newcode--> Если это обнаруживается при просмотре исходного кода во внешнем интерфейсе, значит, ваш новый код работает, и вы можете исключить APC и nginx. Может ли быть так, что записи в журнал ошибок просто буферизуются, поэтому вы видите, что старые записи появляются при просмотре журнала?   -  person John Watson    schedule 16.11.2011
comment
Вы используете модуль кеша для WordPress?   -  person frustratedtech    schedule 16.11.2011


Ответы (2)


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

  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);
    }
person Arend    schedule 15.11.2011
comment
1. Это уже установлено в true. По правде говоря, я только что узнал об этом и планирую отключить это, как только решу эту проблему. - person sphoid; 16.11.2011
comment
3. Да, только fpm имеет общий кеш. - person sphoid; 16.11.2011
comment
Я полностью отключил apc и убедился, что проблема не в нем. - person sphoid; 16.11.2011
comment
2. Была проблема с отступом, не отображались первые части скрипта - person Arend; 17.11.2011

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

person sphoid    schedule 28.11.2011