Рубрики
Uncategorized

Расширение APC PHP приводит к появлению ошибок в файлах

Автор оригинала: David Wong.

Недавно я встретил очень странного человека. ошибка В хосте PHP В процессе регрессии версии кода служба ожидания недоступна. После различных запросов на воспроизведение и документирование было обнаружено, что PHP Из apc Расширено и rsync В то же время, когда он используется, это приведет к невозможности правильной обработки файлов кэша, что в конечном итоге повлияет на работу сервиса. Решения также официально доступны с одной линией конфигурации:

# php.ini
[apc]
apc.stat_ctime=1

Теперь давайте объясним механизм этой проблемы.

Ключевой момент: Используйте PHP+Расширение apc+Механизм синхронизации rsync Ведущий-Ведомый

Проявление сбоя: Файлы не были найдены на момент введения

Когда сервис платформы обновляется онлайн, при доступе к сервису платформы отправляется неверная информация:

Warning: include(Yii.php): failed to open stream: No such file or directory in /home/disk4/htdocs/oss_debug/protected/lib/Yii/framework/YiiBase.php on line 421

Warning: include(): Failed opening 'Yii.php' for inclusion (include_path='.:/home/work/lnmp/weblib/phplib:/home/work/lnmp/lib/php') in /home/disk4/htdocs/oss_debug/protected/lib/Yii/framework/YiiBase.php on line 421

Fatal error: Class 'Yii' not found in /home/disk4/htdocs/oss_debug/index.php on line 42

Приведенные здесь подсказки указывают на то, что проблема заключается в YiiBase.php В файле он представлен в строке 421 В файле он представлен в строке 421 Я не смог найти файл, и вот он здесь. включить Для относительных путей текущими путями введения являются .:/home/work/lnmp/weblib/php lib:/home/work/snmp/lib/php Несколько путей введения в : Раздел, так что здесь это будет ./ , |///главная/работа/lnmp/weblib/php lib , |///дом/работа/snmp/lib/php Найдите файл в трех каталогах и выполните поиск по нему отдельно. Оказывается, что ни один из файлов на самом деле не существует.

Однако при обычном обслуживании поиск в файле производиться не будет. Я думаю, это для того, чтобы решить, существует ли класс Yii или нет, и представить его, если он не существует. Yii.php Класс Yii-это йии .php В файле есть определения, поэтому неверно введено угадывание yii.php В результате.

# yii.php

Эта проблема не была подробно изучена, поскольку было установлено, что неисправность не имеет никакого отношения к этому пункту.

Воспроизведение небольшой проблемы: не удается выполнить обслуживание после смены каталогов

Вам просто нужно переименовать свой сервисный каталог, так как ваш текущий сервисный каталог /home/work/lnmp/htdocs/oss/ Вы переименовываете его /дом/работа/lnmp/htdocs/oss2 На этом этапе вы обнаружите, что служба была затронута:

# Access domain.com/oss2/index.php
Warning: file_get_contents(/home/work/lnmp/htdocs/oss/version): failed to open stream: No such file or directory in /home/work/lnmp/htdocs/oss/index.php on line 26
Warning: require_once(/home/work/lnmp/htdocs/oss/protected/lib/Yii/framework/yii.php): failed to open stream: No such file or directory in /home/work/lnmp/htdocs/oss/index.php on line 38
Fatal error: require_once(): Failed opening required '/home/work/lnmp/htdocs/oss6/protected/lib/Yii/framework/yii.php' (include_path='.:/home/work/lnmp/weblib/phplib:/home/work/lnmp/lib/php') in /home/work/lnmp/htdocs/oss6/index.php on line 38

Вы можете увидеть, когда мы посетим oss2 Программа все еще пытается прочитать каталог oss Файл в каталоге, то файл, естественно, не существует, поэтому сообщается об ошибке. Так почему же это так?

Причина в том, что мы его использовали. PHP apc Расширение.

Процесс обслуживания PHP

Все студенты, изучавшие принципы работы с компьютером, знают, что язык можно разделить на компилируемый язык и интерпретируемый язык. Поскольку язык написан человеком, и машина не может выполнять его напрямую, необходимо пройти процесс компиляции кода в код операции, распознаваемый машиной, прежде чем он будет выполнен.

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

PHP Он относится к языку интерпретации, и рутинный процесс выполнения выглядит следующим образом:

  1. Nginx Перенаправление запросов на PHP Основной процесс
  2. Основной процесс вводит файлы кода
  3. PHP Интерпретатор сначала разбивает код Знак
  4. Создание абстрактного грамматического дерева
  5. Генерировать коды операций, которые машины могут выполнять напрямую
  6. PHP Код операционной системы для выполнения виртуальной машины
  7. Если в файл вводятся другие файлы, описанное выше выполняется итеративно 2-6 шаг
  8. Выполнение завершено, возвращен результат

Вы можете видеть, что каждый раз, когда приходит запрос, файл компилируется и кэшируется один раз, что сильно повлияет на эффективность, чтобы обеспечить гибкость и эффективность PHP , нам нужно кэшировать скомпилированные коды операций. Вот оно. apc Расширение:

  1. Определите, обновляется ли файл
  2. При обновлении перекомпилируйте и кэшируйте
  3. В противном случае прочитайте кэшированный код операции напрямую

расширение apc

Документ о расширении APC

Альтернативный кэш PHP ( APC Необязательно PHP Кэширование) – это открытый и бесплатный Код операции PHP Кэширование. Его цель-предоставить бесплатную, открытую и надежную платформу для кэширования и оптимизации. PHP Промежуточный код.

Расширение также предоставляет некоторые встроенные методы, которые можно использовать для настройки или очистки кэшей вручную. Способ очистки кэша: apc_clear_cache() 。 Этот метод может быть вызван для устранения причины apc Кэшированные файлы с истекшим сроком действия ошибка

Кроме того, нам нужно сосредоточиться на нескольких элементах конфигурации:

целое число apc.stat Включена ли проверка обновления скрипта. Очень осторожно измените это значение инструкции. Значение по умолчанию Вкл.указывает, что APC проверяет, обновляется ли сценарий каждый раз, когда запрашивает сценарий, и автоматически перекомпилирует и кэширует скомпилированное содержимое, если оно обновляется. Но это негативно сказывается на производительности. Если значение выключено, это означает отсутствие проверки, что значительно повышает производительность. Но для того, чтобы обновленный контент вступил в силу, вам необходимо перезапустить веб – сервер. Файлы сценариев на рабочем сервере редко изменяются, и их можно значительно улучшить, отключив эту опцию.

Эта инструкция также действительна для файлов include/require. Но важно отметить, что если вы используете относительный путь, APC должен проверять каждое включение/требование, чтобы найти файл. Использование абсолютных путей может пропустить проверки, поэтому рекомендуется использовать абсолютные пути для операций включения/требования.

apc.stat_ctime целое число Проверка CTime (время создания) позволяет избежать проблем, вызванных SVN или Rsync , и гарантирует, что статистика индексов не изменилась с момента последнего кэширования. APC обычно проверяет только Mtime (время модификации).

целое число apk.file_update_protection При изменении файлов на работающем сервере следует выполнять атомарные операции. То есть сначала запишите во временный файл, а затем переименуйте файл (mv) в окончательное имя. Текстовые редакторы и программы, такие как CP и tar, не работают таким образом, что приводит к возможности буферизации неполных файлов. Значение по умолчанию 2 означает, что при доступе к файлу он не будет буферизован, если время изменения окажется меньше, чем в 2 секундах от времени доступа. Несчастный посетитель может получить неполный контент, но этот плохой эффект не будет усилен кэшированием. Если вы можете убедиться, что все операции обновления являются атомарными, вы можете отключить эту функцию с 0. Если ваша система медленно обновляется из-за большого количества операций ввода-вывода, вам необходимо увеличить это значение.

Как вы можете видеть, расширение apc может привести к двум проблемам:

  1. rsync/svn Существует проблема, связанная с тем, что кэширование файлов не может быть правильно обработано при совместном использовании.
  2. Возможно, вы прочитали неполные документы, в результате чего запросы затрагивают некоторых людей

Также предлагаются решения этих двух проблем.

# php.ini
[apc]
# Start CTime check
stat_ctime=1
# The default value is 2, which increases.
file_update_protection=5

Несмотря на описание в документе, многие люди все еще сталкиваются с такого рода проблемой, которую можно назвать:

  • переполнение стека Вопрос: Проблемы с APC при публикации
  • Официальный Выпуск :apc.include_once_override включить выпуск

При возникновении этой проблемы, в дополнение к описанной выше конфигурации для решения проблемы, вы также можете:

  1. PHP Выполнение в коде apc_clear_cache()
  2. перезапуск php-fpm процесс

Кроме того, мы можем добавить apc Расширенная установка включает в себя apc.php Размещение файлов web Визуальные наблюдения могут быть сделаны в каталоге службы apc Расширенное кэширование.

Использование службы синхронизация rsync

Ключевым фактором в этой ошибке является использование rsync Синхронизации, моя архитектура службы:

Исследуйте причины проблемы

Почему именно? apc Удлиненный каблук rsync Одновременное использование генерирует это жук Я не читал исходный код и не очень хорошо его понимал, но сделал несколько смелых предположений. Следующее недостаточно ясно и правильно. Я надеюсь, что вы сможете дать мне более точные указания. Здесь мы можем видеть, как файл проверяет наличие обновлений, и проблема также возникает в этой части, нет способа определить, обновлен ли файл, при правильном чтении кэшированного файла.

Справочный материал

  1. Настройка времени выполнения PHP Вручную – APC: https://www.php.net/manual/zh…
  2. переполнение стека – Проблемы с APC при публикации:https://stackoverflow.com/que…
  3. Официальный выпуск PHP – apc. проблема включения include_once_override: https://bugs.php.net/bug.php?…
  4. Дополнительный кэш PHP APC: https://www.cnblogs.com/hf805…
  5. Некоторые идеи об онлайн-системах (для php): http://bikong0411.github.io/2…
  6. Как обновить кэш загрузчика классов APC? Как обновить кэш загрузчика классов APC?
  7. Служба синхронизации файлов Rsync: https://xdays.me/rsync%E6%96%…
  8. APC Включают в себя после того, как переопределение прерывает установку:https://www.drupal.org/project…
  9. “Базовый дизайн PHP 7 и реализация исходного кода”

Оригинал: “https://developpaper.com/phps-apc-extension-causes-file-errors-to-be-introduced/”