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

Использование троичного просто, доступно для чтения и очистки:

Предварительно PHP 7
Назначение переменной значение другой переменной, если она установлена, в противном случае присвойте null (или любое другое значение по умолчанию , которое вам нужно):

$newVariable = isset($thePotentialData) ? $thePotentialData : null;

PHP 7+
То же самое, за исключением использования нулевого оператора слияния . Больше нет необходимости вызывать isset(), поскольку он встроен, и нет необходимости предоставлять переменную для возврата, поскольку предполагается, что она возвращает значение проверяемой переменной:

$newVariable = $thePotentialData ?? null;

Оба остановят Уведомления от вопроса OP, и оба являются точным эквивалентом:

if (isset($thePotentialData)) {
    $newVariable = $thePotentialData;
} else {
    $newVariable = null;
}

& nbsp;
Если вам не требуется установив новую переменную, вы можете напрямую использовать возвращаемое значение троичной переменной, например, с echo, аргументами функций и т. д .:

Echo:

echo 'Your name is: ' . isset($name) ? $name : 'You did not provide one';

Функция:

$foreName = getForeName(isset($userId) ? $userId : null);

function getForeName($userId)
{
    if ($userId === null) {
        // Etc
    }
}

Вышеописанное будет работать точно так же с массивами, включая сеансы и т. Д., Заменяя проверяемую переменную, например:

Использование троичного просто, доступно для чтения и очистки:

Предварительно PHP 7
Назначение переменной значение другой переменной, если она установлена, в противном случае присвойте [115] (или любое другое значение по умолчанию , которое вам нужно):

[110]

PHP 7+
То же самое, за исключением использования нулевого оператора слияния . Больше нет необходимости вызывать [116], поскольку он встроен, и нет необходимости предоставлять переменную для возврата, поскольку предполагается, что она возвращает значение проверяемой переменной:

[111]

Оба остановят Уведомления от вопроса OP, и оба являются точным эквивалентом:

[112]

& nbsp;
Если вам не требуется установив новую переменную, вы можете напрямую использовать возвращаемое значение троичной переменной, например, с [117], аргументами функций и т. д .:

Echo:

[113]

Функция:

[114]

Вышеописанное будет работать точно так же с массивами, включая сеансы и т. Д., Заменяя проверяемую переменную, например:
[118]
или сколько вам нужно глубоких уровней, например:
$clients['personal']['address']['postcode']

& nbsp;

Подавление:

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

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

Если вы просто заботитесь о том, чтобы Уведомление не было в журнале ошибок, то в качестве опции вы можете просто проигнорировать журнал ошибок.

SESSION['checkMe']

или сколько вам нужно глубоких уровней, например:
$clients['personal']['address']['postcode']

& nbsp;

Подавление:

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

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

Если вы просто заботитесь о том, чтобы Уведомление не было в журнале ошибок, то в качестве опции вы можете просто проигнорировать журнал ошибок.

5
задан Andy Baird 19 July 2009 в 06:35
поделиться

5 ответов

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

Вы можете использовать гибридный подход.

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

В фоновом задании имейте эскизы созданных изображений (скажем, с помощью ImageMagick), имена файлов которых немного отличаются от самих изображений (например: добавьте «thumb-» на лицевой стороне), но которые хранятся вместе с реальными изображениями. У вас может быть поле в базе данных для каждого изображения, что означает «Моя миниатюра готова, поэтому, пожалуйста, включите меня в галереи».

Когда вы получаете запрос на галерею, То, что говорит Аарон Ф., важно, когда вам нужно обработать очень большое количество запросов. Разделение данных изображения / sql - хороший путь к масштабируемости. Вам нужно будет посмотреть на шаблоны доступа в вашем приложении, чтобы определить, где находятся точки раздела. Что-то, что вы можете сделать еще раньше, - это кэшировать сгенерированный HTML-код для галерей, чтобы уменьшить нагрузку на SQL.

5
ответ дан 14 December 2019 в 01:14
поделиться

Два приведенных вами примера не проясняют наиболее важную часть: разделение.

например, если изображения хранятся в базе данных, находятся ли изображения полностью в одной таблице на одном сервере базы данных? Или таблица разделена на несколько серверов / кластеров?

например, если она хранится в каталоге, все ли изображения находятся на одном жестком диске? Или изображения отображаются на отдельные диски [RAID] на основе первой буквы в имени пользователя?

Для масштабируемости необходима хорошая схема разделения.

Что касается массового отображения эскизов, вам, вероятно, понадобится предварительное вычисление. т.е. создавать эскизы (возможно, с помощью асхронного задания, запускаемого сразу после загрузки изображения) и размещать их на выделенном сервере. Вот как Youtube делает снимки загруженных видео.

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

Несколько лет назад я написал архив изображений в интрасети, предназначенный для хранения примерно 340 тысяч отсканированных изображений и относительных эскизов. Погуглив, я обнаружил, что нет веских причин не выгружать их все в один каталог, если вы не просите базовую ОС сделать список папок. Другими словами, вызов ls / dir приведет к зависанию машины, но простое извлечение файлов изображений по их имени (из базы данных) не повлечет за собой снижения производительности.

Этот архив работает уже пару лет, и я могу подтвердить, что он отлично работает с изображениями размером более 60 тыс., Фактически хранящимися в папке.

У меня никогда не было проблем с преобразованием файлов в формат jpeg с помощью GD,

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

uhm for creating thumbnails, use phpthumb ... it is absolutely perfect for that matter ... and has a few extras, but you probably won't need those ... it automatically creates a local cache on your filesystem, so it is very resource saving ...

i think, the hybrid approach is probably the most scalable, i.e. store files on file system and file locations in a database ... that way, you can store some metadata with the file (like creator, title, tags, etc.), and keep your database small ... plus, you can store your images in arbitrary locations (even on other machines, etc.), so you can easily distribute all that payload ...

greetz

back2dos

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

Имхо, решение Дэвида лучше всего для большинства случаев, но я бы изменил две детали:

Сохранять полный путь к каждому изображению в вашей базе данных.

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

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

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

Библиотека изображений PHP часто проваливает преобразование файлов

Я предлагаю увеличить лимит памяти в сценарии, в котором вы создаете большой палец. , особенно если вы разрешаете загрузку больших (2 МБ +) файлов.

Вы можете сделать это с помощью ini_set ('memory_limit', '30M'); . Конечно, точное количество зависит от вас. 30M работал у меня на сайтах с большим количеством иконок.

Библиотека изображений часто проваливает преобразование файлов

Я предлагаю увеличить лимит памяти в сценарии, в котором вы создаете бегунок, особенно если вы разрешаете загрузку больших (2 МБ +) файлов.

Вы можете сделать это с помощью ini_set ('memory_limit', '30M'); . Конечно, точное количество зависит от вас. 30M работал у меня на сайтах с большим количеством иконок.

Библиотека изображений часто проваливает преобразование файлов

Я предлагаю увеличить лимит памяти в сценарии, в котором вы создаете бегунок, особенно если вы разрешаете загрузку больших (2 МБ +) файлов.

Вы можете сделать это с помощью ini_set ('memory_limit', '30M'); . Конечно, точное количество зависит от вас. 30M работал у меня на сайтах с большим количеством иконок.

1
ответ дан 14 December 2019 в 01:14
поделиться
Другие вопросы по тегам:

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