Я установил небольшую виртуальную машину LAMP для разработки PHP.
Он работает нормально, за исключением того, что когда изображение, которое уже было обработано, изменяется на диске, а затем запрашивается снова, «старое» изображение все еще обслуживается (я получаю ответ 304 Not Modified от apache2). Такое кэширование желательно на сервере, но является проблемой для среды разработки, где файлы часто редактируются.
Единственными (неудобными) способами, которые я нашел для доступа к новому содержимому файла, являются:
sync; echo 3 > /proc/sys/vm/drop_caches
Есть ли директива apache, которую я могу использовать, чтобы гарантировать, что apache будет проверять, был ли файл изменен на диске каждый раз, когда он запрашивается?
Обновить : Загруженные модули Apache:
# apache2ctl -t -D DUMP_MODULES Loaded Modules: core_module (static) log_config_module (static) logio_module (static) mpm_prefork_module (static) http_module (static) so_module (static) alias_module (shared) auth_basic_module (shared) authn_file_module (shared) authz_default_module (shared) authz_groupfile_module (shared) authz_host_module (shared) authz_user_module (shared) autoindex_module (shared) cgi_module (shared) deflate_module (shared) dir_module (shared) env_module (shared) mime_module (shared) negotiation_module (shared) php5_module (shared) setenvif_module (shared) status_module (shared) Syntax OK
редактировать: собственно мой DocumentRoot
хранится в общей папке VirtualBox. Похоже, что когда файл перезаписывается, модуль виртуального бокса не уведомляет Linux об аннулировании его кеша. Отсюда противоречивое поведение. Когда я выполняю ту же операцию перезаписи в «обычном» каталоге linux, этого не происходит.
Хорошо, я нашел объяснение на Билет VirtualBox: оптимизация "sendfile", похоже, не реализована модулем vboxsf.
Пока эта проблема не будет устранена, можно использовать следующую директиву Apache:
EnableSendfile Off
При этом изменения изображений на стороне сервера учитываются немедленно.
Apache делает check - похоже, что временные метки не устанавливаются на текущее время при развертывании файла.
Смотрите мой ответ Вот. По сути, условные запросы - это PITA, которые обычно ухудшают производительность, а не улучшают ее. Хотя этот ответ касается производительности кеширования, он также решит вашу проблему.
С.
Поскольку это только сервер разработки, где файлы часто меняются, самым простым решением является полное отключение кеширования для сервера (или, по крайней мере, для VirtualHost, ответственного за изменяемый веб-сайт). Вы можете использовать CacheDisable Директива проинструктировать mod_cache в Apache, чтобы справиться с этим.
Директива CacheDisable предписывает mod_cache не кэшировать URL-адреса в строке URL-адреса или ниже.
CacheDisable /local_files
Другие варианты включают просмотр доступных директив для mod_disk_cache и mod_mem_cache и использовать их для управления кешированием на вашем сервере. Вы также можете запустить htcacheclean как демон для управления / ограничения дискового кеша, используемого mod_disk_cache.
Обновить: Если mod_cache не включен, указанные выше директивы работать не будут. Это также означает, что любое кеширование выполняется на уровне операционной системы, а не Apache - насколько мне известно, только mod_cache (с mod_mem_cache / mod_disk_cache) или mod_file_cache - единственные два способа выполнить кеширование в Apache. Вы можете увидеть больше информации об этом, прочитав раздел Кэширование операционной системы в Руководство по кешированию Apache.
Вы также могли увидеть ответы на этот вопрос (Отключить кеширование всего диска для apache2 в Linux) также размещен на ServerFault. Он не позволяет отключить кеширование на уровне Linux, но указывает на то, что вы можете постоянно запускать следующее:
watch -n 1 `sync; echo 3 > /proc/sys/vm/drop_caches`
Это можно использовать для очистки всего кэшированного в памяти содержимого.