PHP filemtime vs MySQL последнее обновление отметки времени для кэширования изображений в CMS
Я пытаюсь определить, лучше ли сохранять дату последнего изменения изображения в базе данных MySQL или использовать функцию PHP filemtime.
В моем случае вся информация о веб-сайте хранится в базе данных (cms), поэтому всегда есть запрос, чтобы получить путь к изображению и т. Д. Вопрос в целях кэширования, мне нужно, чтобы мой вывод HTML был примерно таким: <img src="/img/photo.jpg?v20190613" />
, Из того, что я читал на сайте php.net, эта функция кешируется. Так будет ли он использовать меньше ресурсов для добавления поля в таблицу базы данных, в которой хранится последняя обновленная отметка времени, или использовать эту функцию каждый раз? Есть ли какие-либо преимущества в любом случае? Я ищу то, что даст лучшую производительность.
3 ответа
Я бы не использовал filemtime() по одной конкретной причине: он работает только для проверки локальных файлов на том же хосте, где работает код PHP.
В современных приложениях часто встречается развертывание кода PHP на другом хосте, чем тот, который обслуживает статические ресурсы. Фактически, это типичное развертывание кода PHP на нескольких серверах приложений за балансировщиком нагрузки, так что вы можете выполнять развертывание без потери времени.
У вас может не быть этой архитектуры сегодня. Вы можете развернуть PHP-код на том же хосте, где живут ваши статические файлы, и вашей базе данных тоже. Но так как ваше приложение превосходит один хост или требует непрерывной работы во время развертываний, вам в конечном итоге придется масштабироваться до нескольких хостов. Было бы лучше спланировать это на ранней стадии и не реализовывать код, который мешает вам масштабироваться, если вы можете избежать этого.
Ни один из серверов приложений PHP не будет иметь прямого доступа к файловой системе, в которой хранятся статические файлы. Если бы они это сделали, вам бы пришлось выполнить одно из следующих действий:
- Храните дубликаты статических файлов на каждом сервере приложений PHP, используя гораздо больше места для хранения. Затем позаботьтесь о том, чтобы синхронизировать их, подготовьте несколько серверных сценариев для постоянной проверки того, что все хосты имеют одинаковый набор файлов и т. Д.
- Сделайте файловую систему для статических файлов удаленно подключенной ко всем хостам приложений PHP через NFS или аналогичный протокол. Тогда
filemtime()
проверки станут несколько медленнее, потому что они идут по NFS. И вам придется беспокоиться об отключении монтирования NFS, обеспечении безопасности, настройке NFS при добавлении нового хоста приложения и так далее.
По этим причинам я бы предпочел поместить метку времени в базу данных, так как у вас уже есть метаданные файла (путь) в любом случае.
Использование базы данных MySQL в основном лучше
MySQL делает и может выполнять индексацию BST и кэширование запросов, что является роскошью, не всегда доступной для файловой системы.
И, учитывая ваш конкретный случай, сохранение метки времени в базе данных будет намного быстрее, потому что метка времени будет храниться вместе с путем к изображению, так что вы, вероятно, получите и метку времени, и путь к файлу за один раз, с другой стороны, использование filemtime будет дорогостоящим, потому что php будет запрашивать файловую систему, а файловая система будет искать файл, чтобы получить его метку времени.
Я перестал использовать имя загруженного файла в качестве имени файла на сервере. Когда я сделал это, важные файлы были перезаписаны (например, PHP, CSS и т. Д.). Поэтому я добавляю случайную строку в имена файлов при сохранении файлов.
При этом каждое имя файла уникально, поэтому:
- Файлы не перезаписываются.
- Имена файлов уникальны, поэтому они не кэшируются.
Следовательно, вы не попадете в свою проблему с добавлением строки в URL вашего изображения.
Кстати: для файлов CSS и JS я бы также добавил случайные строки в имена файлов вместо добавления "GET-параметров".