Связывание изображения с файлом PHP - PullRequest
0 голосов
/ 25 июня 2010

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

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

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

Итак, на самом деле, мой вопрос: это самый эффективный способ?Обратите внимание, что на одной странице может быть от 3 до 30 изображений, и все они обращаются к этой функции.

Ответы [ 5 ]

2 голосов
/ 25 июня 2010

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

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

1 голос
/ 25 июня 2010

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

Но если вы хотите сделать все возможное, чтобы минимизировать запросы или что-то еще, вы могли бы вместо этого сделать следующее:когда кто-то вставляет изображение в сообщение, замените якорный тег какой-либо специальной последовательностью символов, например [MYIMAGE=1234] или чем-то подобным.Затем при просмотре страницы с одним или несколькими сообщениями выполните поиск по всем сообщениям, чтобы найти все последовательности [MYIMAGE=], запросите базу данных, чтобы получить все местоположения изображений, а затем выведите сообщения с замененными последовательностями [MYIMAGE=].с соответствующими тегами привязки.Возможно, вы захотите или не захотите убедиться, что пользователи не смогут напрямую добавлять теги [MYIMAGE=] к отправляемому контенту.

1 голос
/ 25 июня 2010

Обычно, я бы порекомендовал держать статический src изображения (вместо php-скрипта).Но если вы позволяете пользователям перемещать их по файловой системе, вам нужен способ их отслеживания

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

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

Используйте формат, предложенный Hammerite, и используйте теги [MYIMAGE=1234] (или что-то подобное).

Затем вы можете получить сопоставления id-пути перед отображением и заменить теги [MYIMAGE] на соответствующиетеги, которые ссылаются на изображения напрямую.Это даст гораздо лучшую производительность, чем вывод изображений с использованием php.

. Вы даже можете полностью обойти базу данных и просто использовать пути к изображениям, такие как (например) /images/hash(IMAGEID).jpg. (Если существуют разные форматы файлов, используйте [MYIMAGE=1234.png], чтобы вы могли добавлять png / jpg / что угодно без вызова базы данных)

Если возникает необходимость изменить расположение изображений, выведитеметод или что-то еще, вам нужно только изменить метод, в котором теги [MYIMAGE] преобразуются в полные пути к файлам.

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

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

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

...