Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

Ограничение кэша магазина


Recommended Posts

Есть ли возможность ограничить кэш в opencart? Дело в том, что магазин довольно большой, картинки товаров занимают много места. А при показе товаров картинки ещё и в кэш грузятся. В итоге объём кэша превышает все мыслимые и немыслимые пределы, наглухо забивая весь отведённый объём хостинга (20 гигов). После этого магазин перестаёт работать.

1. Можно ли как-то ограничить рост объёма кэша помегабайтно? Например 100 мегабайт??? Или поштучно???

2. Или, может, вообще кэш отключить? Магазинчик работает довольно шустро.

3. Или, может, можно картинки брать не с хостинга, а с внешнего адреса? То есть вообще не загружать их на хостинг, а брать по внешнему IP.

Надіслати
Поділитися на інших сайтах


Так у вас проблемы с кешем рисунков, который в /image/cahce/data или системный кеш который в /system/cache?

Если рисунки и рисунков много то соответственно и создается на каждый рисунок несколько разных вариантов размеров.

Как вариант (если используется много похожих размеров) можно оставить на сайте несколько основных размеров, а остальные менять средствами css. Например если одному модулю нужен рисунок 100 на 100, а другому 90 на 90 то для каждого рисунка в системе создается 2 варианта. Можно для 2-х модулей установить 100 на 100, а для второго прописать в css высоту и ширину 90.

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

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

Надіслати
Поділитися на інших сайтах

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

Надіслати
Поділитися на інших сайтах


Как вариант (если используется много похожих размеров) можно оставить на сайте несколько основных размеров, а остальные менять средствами css.

я бы использовал этот вариант

Надіслати
Поділитися на інших сайтах

Скрипт по крону - самый очевидный вариант, но не рабочий, к сожалению.

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

Надіслати
Поділитися на інших сайтах

Почему не рабочий?

Не рабочий потому что, удаление одного файла - это 100% загрузка на CPU :)

А так по сути господа решайте... или место на диске или... вот такая жопа...

Можно вообще cdn прикрутить и сразу удалять файлы... повторно они могут не понадобится :)

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

Надіслати
Поділитися на інших сайтах


Не рабочий потому что, удаление одного файла - это 100% загрузка на CPU :)

Какая 100% загрузка, вы о чем? Мы же не будет удалять каждый час по миллиону файлов?

Если удалять только устаревшие файлы и запускать крон каждый час то сколько файлов устареет за час? 10, 100, 1000? Сколько времени займет для команды rm удалить 1000 файлов? 1 секунда? Так в чем проблема?

  • +1 1
Надіслати
Поділитися на інших сайтах

Да я то понял, это шутка такая была... в конце же смайлик :)

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

Надіслати
Поділитися на інших сайтах


И кэш тут файловый, а не базы.

К стати, CDN + отказ от кэша картинок возможно неплохой вариант. Расскажите, как работает CDN, можно ее использовать в качестве кэша? И как осуществляется загрузка картинок в CDN?

Да вот принцеп один и тот же тока кеши разные как вы заметили таки... оставить то что часто используется... а то что не часто УДАЛИТЬ из КЕША ибо нех жрать место!!!

Правильнее конечно же определить когда последний раз открывали эту картинку (заходили на страницу с ней) и если ее не открывали последние сутки то удалить ее... но это ГЕМОРОЙНО!!!

Поэтому как я в начале и предложил берем то что старше суток и удаляем... что мы имеем в итоге... нам надо что-то заново создать при заходе на эту страницу... верно?

Какова вероятность что тут же нам их придется создать (ВСЕ!)!? Тут все зависит от кол-ва посетителей на сайте... если у человека кеш на 20гб то берем 20.000.000кб делим на 20кб (средний размер) и получаем 1000.000 картинок... предположим у человека 10 картинок на товар... у него 100.000 товара в базе...

Берем количество просмотров 10.000 человек, каждый получает по 10 картинок, т.е. за сутки его база должна отработать 1/10 всего...

Делим 100.000/24/60 в минуту надо зафигарить 70 картинок, т.е. это чуть больше 1 картинки в секунду, это при том что запрос не попал в кеш... это нагрузка ниипаца просто :) на самом деле если у него есть 10к простмотров, то он скорее купит хостинг где есть хотябы 100гигов места :)

Да я то не ошибся форумом, а вот вы не зная даже что такое cdn походу явно имеете ошибку... и ошибка это как в одном анекдоте :)

Надіслати
Поділитися на інших сайтах


Не нужно забывать так же что далеко не все товары в магазине просматриваются равномерно. Всегда есть какие-то топовые модели или товары по акциям или товары на первых страницах в каталогах, которые просматриваются регулярно (думаю их будет процентов 20) и товары, не очень популярные или которых может вообще не быть на складе и которые просматриваются раз в несколько дней.. (а таких вполне может быть процентов 80)

Правильнее конечно же определить когда последний раз открывали эту картинку (заходили на страницу с ней) и если ее не открывали последние сутки то удалить ее... но это ГЕМОРОЙНО!!!

А это кстати вариант! Есть такая linux команда - touch, которая меняет время доступа к файлу. Так почему бы во время каждого обращения к файлу (или для файлов, старше несколько часов) не запускать эту команду? Так у нас все популярные файлы будут со свежими датами доступа и удаляться будут только не популярные.

Надіслати
Поділитися на інших сайтах

Тоже подумал про touch, но webserver может делать touch? Веб-сервер из /image/cahce выдает товары как статику, а то придется по запросу запускать php-скрипт, который будет делать сначала touch, а потом например кидать redirect-header. Хорошо ли это?

ресайзинг картинок происходит через модель ModelToolImage, где есть такой код:

class ModelToolImage extends Model {
 public function resize($filename, $width, $height) {
if (!file_exists(DIR_IMAGE . $filename) || !is_file(DIR_IMAGE . $filename)) {
  return;
}
$info = pathinfo($filename);
$extension = $info['extension'];
$old_image = $filename;
$new_image = 'cache/' . utf8_substr($filename, 0, utf8_strrpos($filename, '.')) . '-' . $width . 'x' . $height . '.' . $extension;
if (!file_exists(DIR_IMAGE . $new_image) || (filemtime(DIR_IMAGE . $old_image) > filemtime(DIR_IMAGE . $new_image))) {
  // создание нового рисунка
}
else {

// тут добавляем touch

}

if (isset($this->request->server['HTTPS']) && (($this->request->server['HTTPS'] == 'on') || ($this->request->server['HTTPS'] == '1'))) {
  return HTTPS_IMAGE . $new_image;
} else {
  return HTTP_IMAGE . $new_image;
}
 }
}

Надіслати
Поділитися на інших сайтах

Можно и touch, но не у всех линух сервера :)

А при экспорте не оригинал нужен?

Тут модуль же есть дык он вообще свое разрешение для яндекса делает... и заметьте там правильно указано что это дело лучше что бы работало под КРОНОМ!!! И потом опять товарищь toporchillo через кешь отдать даже сам список... а тут кешь уже не рулит т.к. его надо чистить... Не пытайтесь решить проблему всю целиком!!! Тогда тупо при экспорте товарищу МЕСТА НЕ ХВАТИТ НИКАК и все он попал!!! неужели это так трудно понять? Хотя да куда проще лепить что первое в голову придет... :)

Даже при экспорте они нужны все, но как вы НЕ заметели НЕ СРАЗУ! Это то вы хоть понимаете, что даже яндекс за секунду все картинки не запросит или и тут будете спорить?!

P.S. аплоад картинок не происходит, читайте про технологию cdn самостоятель, и про индексы/кеширование mysql...

Надіслати
Поділитися на інших сайтах


Кстати- насчёт убивания картинок из кеша по крону- интересная идея. Об остальном по- порядку:

1. С количеством товара угадали, чуть больше 70 тысяч.

2. Кэш забивает именно картинок, не mySQL.

3. Нагрузка на магазин пока никакая: и ста посещений в сутки нету (он ещё даже гуглом не проиндексирован).

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

5. Когда имел в виду картинки грузить из другого места- предполагалось взять дома статический айпишник (или даже через no-ip.org) и картинки отдавать с домашнего веб-сервера. Пока от этой идеи окончательно не отказался. Но не знаю где чего подпилить в самом магазине.

6. Картинки размером 600х600, в магазине выдаются этого же размера. Но в кэш они всё-равно почему-то попадают.

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

Надіслати
Поділитися на інших сайтах


Есть одни вариант. Пример здесь http://avtokuzov.by/...id_category=63. (сейчас сайт переделан и ссылка уже не актуальна) Магазин правда сделан на Prestashop, а хостинг дешевый (200 р. в месяц) поэтому сам сайт тормозной. Но суть в том, что все картинки товара там на самом хосте отсутствуют. Там товары грузятся примерно раз в 2-3 дня с сайта-донора. Картинки тоже предоставляются как URL на сайте доноре. Так во на сайте получателе я доработал скрипт 404.php, который поднимается каждый раз, как не находится нужный файл (в нашем случае это файл картинки) и в котором собственно возвращается альтернативный URL( и это урл на сайте доноре), из которого и грузится контент в src в тэге img. Ну размеры соответственно задаются версткой. Единственный недостаток - замедление загрузки картинок если они сделаны в высоком разрешении и размеры файлов велики.

Змінено користувачем EVMedvedev
Надіслати
Поділитися на інших сайтах


Так во на сайте получателе я доработал скрипт 404.php, который поднимается каждый раз, как не находится нужный файл (в нашем случае это файл картинки) и в котором собственно возвращается альтернативный URL( и это урл на сайте доноре), из которого и грузится контент в src в тэге img. Ну размеры соответственно задаются версткой. Единственный недостаток - замедление загрузки картинок если они сделаны в высоком разрешении и размеры файлов велики.

Это пять! :)

Проблемку решил. У меня есть робот, который обслуживает мой магазин (в том числе общается в соцсетях). Вот он каждый час и чистит кэш. оставляет только 100 самых популярных товаров (берётся из таблицы products в поле view таким запросом:

SELECT product_id FROM vanoid.product where viewed>0 order by viewed desc limit 100

). Единственный возможный минус- может убить картинку, которую только что запрашивали, и запросили ещё раз сразу после чистки кэша. Ну- тогда просто в кэш оно запишется ещё раз. Пока буду тестировать.

Ком нужно- вот код. Написано на Delphi.

procedure TForm1.Cleancache1Click(Sender: TObject);
var q:TADOQuery;
   SL:TStringList;
 procedure GoDir(dir:string);
 var i,ind:integer;
  List:TStringList;
  art:integer;
 begin
   if CloseAttempt then exit;
   if not IDFTP1.Connected then IDFTP1.Connect;
   IDFTP1.ChangeDir(dir);
   List:=TStringList.create;
   List.Clear; IDFTP1.List(List,'',false); List.Sort;
   for i:=0 to List.Count-1 do
  begin
    if pos('.',List[i])=0 then GoDir(dir+'/'+List[i]);
    if pos('.jpg',List[i])=length(List[i])-4+1 then
	  begin
	    art:=strtoint(Replace(Replace(dir,'/domains/тратата.ru/image/cache/data/img',''),'/',''));
	    if not SL.Find(inttostr(art),ind) then
		  begin
		    AddLog('Deleting from cache: '+List[i]);
		    IDFTP1.Delete(List[i]);
		  end
		  else
		  begin
		    AddLog(List[i]+' not deleted as top 100 popular');
		  end;
	  end;
  end;

   List.Clear; IDFTP1.List(List,'',false); List.Sort;
   if list.Count=2 then
  begin
    IDFTP1.ChangeDir('..');
    IDFTP1.RemoveDir(dir);
  end;
   List.Free;
 end;
begin
 AddLog('Cleaning image cache');
 q:=TADOquery.Create(nil);
 q.Connection:=MySqlConnection;
 q.SQL.Add('SELECT product_id FROM vanoid.product where viewed>0 order by viewed desc limit 100');
 q.Open;
 SL:=TStringList.Create;
 while not q.Eof do
   begin
  SL.Add(q.Fields[0].asstring);
  q.Next;
   end;
 SL.Sort;
 q.free;
 GoDir('/domains/тратата.ru/image/cache/data/img');

 SL.Free;
 AddLog('Cleaning image cache complete');
end;

Надіслати
Поділитися на інших сайтах


Какой модуль? Этот? http://opencartforum...BA%D0%B5%D1%82/ :-)

Мне тяжело понять, когда так мало запятых и много "!!!".

Угу он самый... что у всех клиентов при обработке некислые тормоза на серваках как вы утверждаете выше или таки вы еще раз ошиблись тут?

2Vanoid при 100 человеках в сутки, думаю кеш можно и раз в неделю чистить и не морочится на mysql и на все прочее...

К стате что бы touch запустить нужне же sheel-exeс или другой исполнитель... они обычно на виртуалах отключены дабы не плодить левую нагрузку... т.ч. остаются отметки в mysql или не париться на время последнего обращения вообще...

Надіслати
Поділитися на інших сайтах


2Vanoid при 100 человеках в сутки, думаю кеш можно и раз в неделю чистить и не морочится на mysql и на все прочее...

Это пока. Очень надеюсь, что потом будет больше :)

Надіслати
Поділитися на інших сайтах


OMG!!

совет: добавьте индекс для viewed

Пока никаких тормозов не замечено. Информацию выводит мгновенно. Пока не столкнусь с проблемой- добавлять не буду :)

А по поводу дельфи- отчего такие восклицания??? На хостинге нет ни крона, ни возможности чего бы то ни было ещё мудрить. Дешёвый хостинг :)

Надіслати
Поділитися на інших сайтах


Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз

×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.