Что лучший способ состоит в том, чтобы сохранить пользовательские изображения с помощью PHP и MySQL?

Конечным результатом является то же. Различие:

  • 'localhost' решает на уровне TCP/IP и эквивалентен IP-адресу 127.0.0.1
  • В зависимости от приложения", (локального)", мог быть просто псевдоним для 'localhost'. В SQLServer, '(локальном)' и'.' среднем, что связь будет установлена с помощью именованных каналов (общая память) протокол в той же машине (не должен проходить стек TCP/IP).

Это - теория. На практике я не думаю, что существуют существенные различия в производительности или функциях при использовании любого из них.

11
задан begin 7 November 2009 в 05:03
поделиться

7 ответов

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

  • Проксирование и веб-запросы If-Modified-Since: Apache может обрабатывать If-Modified-Since HTTP заголовки для вас и возвращают ответ 304, и это лучшая производительность, которую вы можете получить. Прокси-серверы обратного Squid и прокси-серверы, размещенные у интернет-провайдеров, попытаются воспользоваться этим.

  • Сканирование на вирусы: если вы разрешите загрузку любых файлов, придурки попытаются загрузить страшные вещи, чтобы увидеть, смогут ли они взломать ваш сайт. Нет ничего неразумного в том, чтобы запустить ClamAV или что-то подобное против ваших пользовательских загрузок, чтобы увидеть, нет ли проблем. Вы бы не хотели связывать свою базу данных, если хотите сканировать записи на наличие вредоносных программ.

  • Простота схемы: Если вы разрешаете загрузку файлов, вам также необходимо добавить метаданные о MIME-типе, размер, высота и ширина файла. Если сам файл не соответствует MIME-типу в таблице, вам необходимо закодировать выбор из таблицы и передать его в / usr / bin / file . Это может быть намного проще shell_exec ("/ usr / bin / file / path / to / mumble") .

  • Упоминание большого пальца: загрузка пользовательских изображений, вероятно, должна выполняться большим пальцем -nailed, и это часто намного проще сделать асинхронно с фактическим веб-запросом. Это действительно неинтересно, когда какой-то благонамеренный пользователь пытается загрузить файл фотошопа размером 150 МБ, предоставленный им их приятелем-профессиональным фотографом, а ваш экземпляр apache переходит в состояние OOM при попытке загрузить библиотеку ImageMagick в пространство памяти веб-воркера. Это действительно не масштабируется для рабочих apache. Для выполнения этой работы создайте задание рабочей очереди / cron вне Apache.

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

  • Резервное копирование и восстановление: Вы действительно не хотите блокировать большую таблицу с помощью mysqldump. Использование rsync сэкономит вам много времени и даст вам большую гибкость. Таблицы обычно восстанавливаются как целая таблица за расписанием - таблицы обычно не копируются по частям.

13
ответ дан 3 December 2019 в 02:02
поделиться

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

<img src="<path>/users_images/<user_id>/thumb.gif" />
3
ответ дан 3 December 2019 в 02:02
поделиться

«Лучшее» зависит от вашей цели.

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

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

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

Отредактировано для добавления

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

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

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

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

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

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

16
ответ дан 3 December 2019 в 02:02
поделиться

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

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

2
ответ дан 3 December 2019 в 02:02
поделиться

Я предлагаю иметь таблицу, в которой вы храните пользовательские данные, такие как имя пользователя, имя. В этой таблице создайте поле под названием «аватар», в котором вы можете сохранить ссылку на файл.

Предполагая, что ваши аватары пользователей хранятся в: htdocs / images / avatars / А пользовательский apikot имеет аватар "avatar.jpg", сохраненный для этого пользователя в базе данных, вы можете затем скомпилировать следующий URL-адрес при создании тега изображения: "/htdocs/images/avatars/avatar.jpg".

1
ответ дан 3 December 2019 в 02:02
поделиться

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

Еще один способ сделать это - сохранить местоположение изображения в столбце и запросить его для ссылки.

0
ответ дан 3 December 2019 в 02:02
поделиться

Создайте поле типа BLOB и вставьте результат file_get_contents ($ ImageFile)

0
ответ дан 3 December 2019 в 02:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: