Не удается заставить веб-сервер перезагрузить образ с диска - PullRequest
0 голосов
/ 25 мая 2018

Фон

Моя цель - создать веб-сервер, который отображает слайд-шоу страниц.Некоторые слайды могут быть только изображениями, другие - текстом css.

Безопасность

Ничего особенного, он не будет открыт для внешнего мира.

Интерфейс

Пользователи должны иметь возможность изменять текст в текстовых слайдах.

Пользователи должны иметь возможность изменять изображения, отображаемые на слайдах.

Изображения должны изменяться автоматически (другая машина в сети создает изображение и должна иметь возможность отправить это изображение на сервер для отображения. Или сервер должен иметь возможность загрузить само изображение в любом случае).

Что у меня есть

Зная очень мало в этой области, я начал читать и мастерить.Сервер LAMP казался достаточно простым.

Я скопировал контейнер слайд-шоу из w3 (который, как я позже понял, был плохим источником по мнению знающих людей), и удалил вещи, которые не сделалнужно.

Я создал:

  • формы для ввода текста пользователями, сохраненные в виде простых текстовых файлов (ну, это работало до того, как я обновил Ubuntu, думаю, обновление пакета что-то сломало, теперь формы показывают только необработанный код php. Редактирование: необходимо для включения модов, вероятно, потому что php обновлен с 5 до 7: sudo a2enmod php7.2).
  • мой собственный текстовый слайд в html, чтение из файлов,Это было хлопотно, чтобы заставить его читать из файлов при изменении.Я думаю, что txtFile.setRequestHeader('pragma', 'no-cache'); это то, что сделал.
  • слайд с локальным изображением

Мой реальный реальный вопрос

Копирование нового изображения вместоФайл, используемый в качестве входных данных для слайда изображения, не меняет изображение, отображаемое сервером.Кажется, это общая проблема, и в течение года предлагается несколько решений.Ничего из этого мне не удалось заставить работать.Случайные строки в конце файла и адреса (сложно автоматизировать?), Этот фрагмент в моей голове index.html:

+    <!-- attempt to reload images on change, does not work: -->
+    <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
+    <meta http-equiv="Pragma" content="no-cache" />
+    <meta http-equiv="Expires" content="0" />

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

Итак, в моей настройке (Ubuntu 18.04, пакеты apt для LAMP и недавний Chrome), как заставить сервер перезагружать изображение с диска при отображении слайда?

Редактировать: я не хочу нажимать обновить, сервер должен перезагрузить изображение автоматически.

Еще один неясный вопрос, который на самом деле может быть виновником

Я делаю что-тостранно?Мне кажется, что разработка этого более громоздка, чем должна быть, так что я могу оказаться на неправильном пути.Не могли бы вы привести меня к другому, более разумному направлению?

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

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

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

<img src="/path/to/image.jpg?v=<?php time(); ?>">

Это заставит ваш браузер всегда загружать <img>, потому что он будет думать, что это новый файл.Однако отключение кэша браузера, особенно для изображений, является огромным ударом по производительности.


Лучшим подходом является присвоение уникальных идентификаторов вашим изображениям и сохранение их (в базе данных), так что их уникальный параметр толькоизменяется при изменении файла.


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

  • в сценарии обработки загрузки изображений, при успешной загрузке, также запишите текущую метку времени в файле на сервере (например: timestamp.txt).
  • в вашей разметке, используйте содержимое этого файла, чтобы отметить ваше изображение (s):
    <img src="path/to/file.jpg?v=<?= file_get_contents('./timestamp.txt'); ?>">
  • сделать вызов ajax, читая timestamp.txt каждые несколько секунд.Если содержимое timestamp.txt отличается от параметра v вашего src, замените значение src новой отметкой времени, в результате чего браузер мгновенно перезагрузит файл.
    Примечание: theСам ajax будет кэшироваться, если вы не убедитесь, что он не:
    'timestamp.txt?v=' + new Date().getTime()
0 голосов
/ 25 мая 2018

Вы можете заставить веб-сервер перезагрузить изображение с диска, изменив его URL.Поскольку вы не хотите менять его имя или путь очень часто, вы дадите ему параметр av, например:

<img src="/images/myimage.png?v=2">

, и если вы захотите перезагрузить его снова, измените его на

<img src="/images/myimage.png?v=3">

и т. Д.

...