PHP filemtime vs MySQL последнее обновление отметки времени для кэширования изображений в CMS - PullRequest
2 голосов
/ 14 июня 2019

Я пытаюсь определить, лучше ли сохранять дату последнего изменения изображения в базе данных MySQL или использовать функцию PHP filemtime .

В моем случае вся информация о веб-сайте хранится в базе данных (cms), поэтому всегда есть запрос, чтобы получить путь к изображению и т. Д. Вопрос в целях кэширования, мне нужно, чтобы мой вывод HTML был примерно таким: это <img src="/img/photo.jpg?v20190613" />. Из того, что я читал на сайте php.net, эта функция кешируется. Так будет ли он использовать меньше ресурсов для добавления поля в таблицу базы данных, в которой хранится последняя обновленная отметка времени, или использовать эту функцию каждый раз? Есть ли какие-либо преимущества в любом случае? Я ищу то, что даст лучшую производительность.

Ответы [ 3 ]

8 голосов
/ 19 июня 2019

Я бы не использовал filemtime () по одной конкретной причине: он работает только для проверки локальных файлов на том же хосте, где работает код PHP.

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

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

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

  • Храните дубликаты статических файлов на каждом сервере приложений PHP, используя гораздо больше места для хранения. Затем позаботьтесь о том, чтобы поддерживать их синхронизацию, используйте некоторые фоновые сценарии для постоянной проверки того, что все хосты имеют одинаковый набор файлов и т. Д.
  • Создание файловой системы для статических файлов, удаленно подключаемой ко всем хостам приложений PHP через NFS или аналогичный протокол. Тогда проверки filemtime() станут несколько медленнее, потому что они идут по NFS. И вам придется беспокоиться об отключении монтирования NFS, обеспечении безопасности, настройке NFS при добавлении нового хоста приложения и т. Д.

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

0 голосов
/ 26 июня 2019

Я перестал использовать имя загруженного файла в качестве имени файла на сервере.Когда я сделал это, важные файлы были перезаписаны (например, PHP, CSS и т. Д.).Поэтому я добавляю случайную строку к именам файлов при сохранении файлов.

При этом каждое имя файла уникально, поэтому:

  • Файлы не перезаписываются.
  • Имена файлов уникальны, поэтому они не кэшируются.

Следовательно, у вас не возникнет проблем с добавлением строки в URL вашего изображения.

Кстати: Для файлов CSS и JS я бы также добавил случайные строки в имена файлов вместо добавления «GET параметры».

0 голосов
/ 25 июня 2019

Лучше использовать базу данных MySQL

MySQL делает и может выполнять индексацию BST и кэширование запросов, что является роскошью, не всегда доступной для файловой системы.

И, глядя на ваш конкретный случай, сохранение метки времени в базе данных будет намного быстрее, потому что метка времени будет храниться вместе с путем к изображению, так что вы, вероятно, получите и метку времени, и путь к файлу за один раз, с другой стороны, использование filemtime будет будет дорогостоящим, потому что php будет запрашивать файловую систему, а файловая система будет искать файл, чтобы получить его метку времени.

...