Боремся за место на диске

На выходных досмотрелся что движок не удаляет загруженные на сервер оригиналы картинок в фотосетах, аватарках пользователя и аватарках блогов. Учитывая что по умолчанию для фотосета выставлено 6Мб на картинку и 30 картинок для загрузки это будет 6 х 30 = 180Мб на один фотосет это конечно ничто для хостинга в 3Тб, но для 2Гб хостинга это всего 11 фотосетов, ужос!!!
Попробовал поставить плагин пылесос, думал он поможет, но увы там этого не реализовано.
Пришлось лезть в исходники. Вобщем вот что получилось (для LS 0.5.1) (Для лентяев скачать готовое):

Для фотосета файл: classes/actions/ActionPhotoset.class.php
Ищем. После 287 строки, после кода:
} else {
	$this->Message_AddError($this->Lang_Get('system_error'), $this->Lang_Get('error'));
}

Вставляем код
@unlink($this->Image_GetServerPath($sFile));
Эта строка удаляет закачанную картинку

Для аватарок файл: classes/actions/ActionSettings.class.php
Ищем. После 298 строки, после кода:
} else {
         $bError=true;
         $this->Message_AddError($this->Lang_Get('settings_profile_avatar_error'),$this->Lang_Get('error'));
}

Вставляем код
@unlink($this->Image_GetServerPath($this->oUserCurrent->getProfileAvatarPath($_FILES['avatar']['tmp_name'])));
Эта строка удаляет закачанную картинку

Для аватарок блогов файл: classes/actions/ActionBlog.class.php
Ищем. После 212 строки, после кода:
} else {
	 $this->Message_AddError($this->Lang_Get('blog_create_avatar_error'),$this->Lang_Get('error'));
	 return false;
}

Вставляем код. Вот здесь уже не нашел переменной с путем закачанной картинки и применил регулярку.
$full_patch = preg_replace('/\_[\d]{1,6}x[\d]{1,6}(\..*?){1,6}$/','$1',$sPath);			
@unlink($this->Image_GetServerPath($full_patch));
Эти строки удаляют закачанную картинку

Ищем. После ! В оригинале!318 строки, после кода:
} else {
	 $this->Message_AddError($this->Lang_Get('blog_create_avatar_error'),$this->Lang_Get('error'));
	 return false;
}

Вставляем код
$full_patch = preg_replace('/\_[\d]{1,6}x[\d]{1,6}(\..*?){1,6}$/','$1',$sPath);			
@unlink($this->Image_GetServerPath($full_patch));
Эти строки удаляют закачанную картинку

Ну вот и все, теперь оригиналы картинок удаляются сразу после загрузки и ресайза. Надеюсь кому-нибудь пригодиться.

32 комментария

avatar
+1, полезно!
avatar
Хотел плагином сделать, не нашел документацию, да и не искал толком еще.
avatar
при этом вы теряете возможность последующей конвертации изображений.
avatar
Если не сложно, поясните плиз свою мысль. Если аватар уже обработан и загружен, то как может быть в дальнейшем использован оригинал?
Мне что-то подсказывает, что он уже не нужен и должен быть удален (не плагином, а движком)
avatar
предположим у вас весь фотосет конвертируется в максимальное размер 100х100.

Внезапно вас кусает муха и вы понимаете что вас не устраивает размер 100 на 100 и вам нужно например 350 на 250.
Ваши действия? :)
avatar
Можно ведь эту закачанную картинку хранить на каком-нибудь Dropbox?
avatar
вы сами понимаете что ваше предложение идет в разрез с поставлеными условиями
Учитывая что по умолчанию для фотосета выставлено 6Мб на картинку и 30 картинок для загрузки это будет 6 х 30 = 180Мб на один фотосет это конечно ничто для хостинга в 3Тб, но для 2Гб хостинга это всего 11 фотосетов, ужос!!!
20 гигов дропбокса — это 110 фотосетов. Кроме того, у дропбокса есть ограничения на количество одновременных просмотров для паблика и на больших ресурсах вы эту картинку рискуете не увидеть например.
да и например amazonS3 не так уж дорого стоит.
avatar
честного говоря конкретно фотосетами не пользовался, но аватарки я бы перезаливал (предварительно сменив настройки по размерам).
в фотосете размера превью выставляется в админе, т.е нужно предварительно поменять на новый размер. А как дальше воспользоваться оригиналами, которые на сервере лежат?

P.S.
И потом, если взять рабочий сайт, то очевидно что при большом количестве материалов меня уже муха будет кусать осторожнее и я не буду метаться от размера к размеру.
avatar
в моем плагине например, есть галка в админке, совместно с предупреждением о размерах картинок, и кнопка конвертации картинок на нужные размеры по запросу
avatar
В движке реализован авто ресайз старых фотосетов?
avatar
реализовать его — дело пары часов.
avatar
Полезная модификация! Есть явные минусы? может кто сказать?
avatar
иногда нужны оригиналы. мне в одном проекте надо было.
avatar
*т.к. в случае изменения параметров из оригиналов пережимались изображения в нужных размерах. но это частный случай.

я больше вижу это как опцию в конфиге «удалять оригиналы».
avatar
можете частично описать частный случай (то есть ваш)
avatar
поддержу, в идеале это вынести как опцию в конфиге
avatar
Полностью с Вами согласен
avatar
дисковое пространство сейчас очень дешево. я наоборот бекаплю оригиналы картинок до ресайза, чтобы в будущем не попасть в ситуацию, когда качество старых картинок не подходит.
avatar
Извиняюсь, а не подскажите каким сервисом Вы пользуетесь?
avatar
пока просто на сервере храню. на дедике стоят винчестеры 2x3 ТБ SATA6
avatar
Ниче так дедик) С 6ТБ можно вообще делать двойной бекап)
На счет картинок, кстати, фейсбук, вконтакты и другие highload-проекты вообще делают тройное дублирование всей загружаемой инфы на трех разных серверах, чтобы, в случае выхода из строя одного — инфа не пропадала. Обычным «смертным» людям вроде меня, у которых винчестеры небольшие, очень важно следить за местом. Вот прикиньте такую схему — регаешься у кого-то на сайте под управлением ЛС и начинаешь делать фотосеты по максимуму заливая фотки и после сохранять в черновики. Админ далеко не сразу поймет, куда же подевалось все свободное место..)
avatar
Как оригиналы распознать на сервере, если они уже загружены? Что искать?
avatar
у них нет постфикса "_250" и т.п.
avatar
мы встроили этот функционал в плагин Use Watermark. там есть опция сохранять оригиналы. они в отдельную папку сохраняются до ресайза и накладывания водяного знака.
avatar
ну так что будет у нас такой плагин :) как описано вы топике и доп. комментарией?

А и еще важна поддержка amason s3 ))))
avatar
Когда прочитаю документацию по плагинам обязательно напишу, если раньше никто не напишет
avatar
А я решил проблему (правда в одном из rails проектов) — я храню все картинки в Dropbox. Думаю и статику можно всю туда. Бесплатно и удобно.
avatar
С недавнего времени стал пользоваться сервисом amason s3, теперь проблем никаких, особенно с бекапом (достаточно хранить файлы движка). Очень удобно :)
avatar
говорите с дампом движка?, вы это через плагин делаете?? или как?

тож все храню на амазон с3 ) счастье!!!
avatar
бэкап вручную… :( но хотелось бы автоматизировать на тот же амазон.
Есть плагин, но он только на почту вроде бы отправляет.
avatar
Ну я видел много php скриптов по инету которые делают бэки… и на амазон шлют.

Да было бы класссссно такой плагинчик… Эх знаний в пхп бы побольше.
avatar
Спасибо за статью, полезно (особенно с фотосетами). А с блогами и аватарками можно решить проблему через config.php
Измените значение настроек «module.user.avatar_size» и «module.blog.avatar_size»
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.