WordPress image resize
Pred dnevi me je presenetil klic mojega server providerja, ki je opazil da mu kurim daleč največ bandwidtha naokoli. Šlo je za okoli 150GB mesečno, pri čemer imam promet neomejen. Saj, če to preračunamo na enakomeren prenost, to sploh ni tako veliko, ampak očitno precej odstopa od ostalih in mu je padlo v oči. Šel sem preverit kaj ustvarja takšen promet in nič ni kazalo na kakšno zlorabo, morebitni vdor na strežnik ali kaj podobnega. Podatek je tudi mene malce presenetil, ker nekako ne pričakujem, da bi moj blog bralo pol Slovenije (ali pač?).
Šlo je enostavno zato, da sam vedno uplodam fotke takšne, kot pač pridejo iz fotoaparata, to pa je po par MB. In potem imam ob strani en image rotator, ki vsakih par sekund potegne novo fotko dol. Recimo 5 na minuto. Pa imamo 15 MB v minutki. In če en post bereš malce dlje, pa smo pokurili 100 MB. Kar seveda ob današnjih hitrostih sploh ne opaziš. Sem pa opazil sam na morju, kjer sem pri objavi in pregledu posta lepo pokuril 100 kun prometa.
Pri iskanju wordpress dodatka, ki bi mi ta problem rešil, nisem bil pretirano uspešen. Par sem jih pogledal in vsi so nekako bolj alimanj reševali resize ob uplodanju, in to vsi z nekimi posebnimi featuresi, da bi mu le nastavil max size pa naj dela vse sam v miru, pa nisem našel. Da bi obdelal moje obstoječe fotke pa tudi ne. Če ima kdo kakšen predlog naj kar sporoči.
Sam sem sicer šel sprogramirat svojo skripto, ki poišče vse fotke in jih resizea na max 1024×800 pixlov (seveda ohrani razmerje). In shrani z default jpg kvaliteto .75, kar sicer pomeni upad kvalitete ampak saj moje fotke itak niso ravno nekaj kjer bi kvaliteta kaj visoko kotirala. In tako se je moje skladišče fotk skrčilo iz cirka 1,5GB na 80 MB. Tako da pričakujem mesečni upad prometa iz 150GB na recimo 10GB. Bomo videli.
Če kdo rabi je koda tukaj -> resize.php.zip. Oziroma copy paste tole spodaj. Sam bom verjento dal v cron job, pa da mi redno resizea, ko bom uplodal nove. Sicer pa skripta originale shrani z končnico .original.
PS: Kako pa vi rešujete ta problem? Saj verjento obstaja kup dobrih pluginov, ampak mene ponavadi vse mine, ko jih par pregledam, in si grem raje kar sam sprogramirat.
<?
$n = 0;
$dir = "../blog/wp-content/blogs.dir";
$from_orig = false;
$size_orig = 0;
$size_new = 0;
function process_dir($dir) {
global $n,$size_orig,$size_new,$from_orig;
$dh = opendir($dir);
while ($item = readdir($dh)) $items[] = $item;
// print_r($items);
foreach($items as $item) {
if ($item=="." or $item=="..") continue;
$fullname = $dir."/".$item;
if (is_dir($fullname)) process_dir($fullname);
if (($from_orig && (pathinfo($fullname,PATHINFO_EXTENSION)=="original")) ||
(!$from_orig && ((strtolower(pathinfo($fullname,PATHINFO_EXTENSION))=="jpg") || (strtolower(pathinfo($fullname,PATHINFO_EXTENSION))=="jpeg")))) {
$ar = getimagesize($fullname);
if ($ar["mime"]!="image/jpeg") break;
$xx = $x = $ar[0];
$yy = $y = $ar[1];
if (($x<=1024) && ($y<=800)) continue;
echo $x."x".$y." ";
if (($x/1024) > ($y/800)) {
$y = $y*1024/$x;
$x = 1024;
} else {
$x = $x*800/$y;
$y = 800;
}
echo $x."x".$y." ";
set_time_limit (30);
try {
if (!$from_orig) rename($fullname,$fullname.".original");
else $fullname = str_replace(".original","",$fullname);
$new = imagecreatetruecolor($x, $y);
$source = imagecreatefromjpeg($fullname.".original");
imagecopyresized($new, $source, 0, 0, 0, 0, $x, $y, $xx, $yy);
echo ". ";
imagejpeg($new,$fullname);
} catch(Exception $err) {
print_r($err);
}
$size_orig += filesize($fullname.".original");
$size_new += filesize($fullname);
echo $fullname." ".filesize($fullname.".original")." ".filesize($fullname)."<br>";
flush();
// if ($n++>10) die();
}
}
}
process_dir($dir);
echo "<br>".$size_orig." ".$size_new."<br>";
Zakaj pa sploh potrebuješ original slike na web serverju?
Mogoče bi bilo bolje, da že ob uploadu narediš resize slike, tako ne bo potrebno poganjat cron joba.
Poleg tega pa kolikor vidim, ti tale skripta vedno obdeluje cel direktorij s slikami (tudi tiste, ki so že obdelane, jih spet preverja), kar pomeni, da zastonj kuri strežnikove resurse, še posebej, če tale cron job poganja skripto večkrat na dan.
Sam imam izkušnje s svojim domačim webserverčkom, in zagotovo vem, da so GD funkcije med najbolj potratnimi funkcijami, zato je dobro optimizirati skripte, da čimmanj uporabljajo te funkcije oziroma, da se uporabljajo “ON DEMAND” torej ob samem uploadu slike.
Have a nice day… JohnQ
Mislim da je fajn vedno imeti original pri roki. Če delaš kakšen redesign itd…
Tisto s preverjanjem celega dira se bi dalo optimizirati. Ampak me ne boli preveč trenutno.
Image processing pa je valjda zelo zahteven procesorsko. Čeprav tole dela par komadov na sekundo. Kar pač ni frke.
s čisto uporabniškega stališča:
slike so zdaj vsaj na win platformi veliko lepše. prej so bile tipično clientovskošlampastopomanjšano nazobčane
Dragi Jeanmark
Ne vem kako naj ti to povem drugače kot pa kar direktno. Zaenkrat te res še nič ne boli, če pa pogledaš malo v prihodnost, pa boš kar hitro ugotovil, da te nekaj boli, vendar takrat ne boš vedel več kaj te boli.
Če v skripti rečeš, naj vedno procesira eno in isto stvar, podatki pa se ti polnijo (vse več je slik za obdelati), bo na koncu strežnik , na katerem gostuješ, delal še samo to, da bo pregledoval slike. Ne bo uspel več niti servirati html-ja, slik in ostalih stvari, ki jih želiš servirati, saj bo cron job delal do onemoglosti in na koncu se sploh ne bo več zaključil, ker bo prišel že novi zahtevek za izvajanje iste skripte, pognal pa jo bo isti cron job. Ponavadi je število hkratnih povezav na en strežnik omejeno, kar pomeni, da boš s takšnim mišljenjem kmalu DOS-al lasten spletni strežnik.
Have a nice day… JohnQ
JohnQ – v vsakem koraku jaz le pogledam dimenzije slik. Na mojem trenutnem blogu mi to naredi v par sekundah. Če poganjam skripto na 5 minut – verjetno pa bom dal na začetku na eno uro, to pomeni da mi ta zadeva pokuri okoli procenta resoursov (ajd 5%). Kar pomeni se ob tem tempu, ki je sedaj, še kakšnih 20 let ne rabim sekirat.
Je pa lepo da gledaš na te zadeve, ker ponavadi se ne ubadamo veliko z njimi. Kot se tudi nisem z velikostjo slik, dokler mi ni provider zatežil (in sem pokuril ves VIP mobile internet).
Cron jobe imam pa tako ali tako ponavadi nastavljene, da se nikoli isti ne zažene preden se prejšnji ne konča. Ker se mi je to, kar si omenil, že kdaj zgodilo.
To da bi resizal ob uploadu mi nekako ne diši, ker bi moral posegati v wordpressovo drobovje, potem pa nikoli ne veš kako bo crknlo, ko bodo dali kakšen upgrade.
Ali uporabljaš kakšen plugin za to? Ker potem “briga moja pređi na drugog”.
Tako na hitro bi rekel, da ti bo eden od tehle dveh pluginov prišel prav…
http://dev.huiz.net/2008/10/04/plugin-resize-at-upload-english/
http://www.inspirationbit.com/wp-vivtiger-image-resizer/
Drugače pa vpišeš v google “wordpress upload image resize”, pa se najde kar nekaj uporabnih stvari ;)
Have a nice day…. JohnQ
Aja pozabil omeniti…. vse GD funkcije so zelo potratne z resursi (tudi getimagesize).
Have a nice day…. JohnQ
Grrr … saj sem napisal da sem najprej probal preiskati, pa mi ni ustrezal noben, v bistvu se mi pa ne da iskati in preverjati tako da … ali uporabljaš ti katerega in kakšne imaš izkušnje z njim?
Vem glede GD funkcij in resourcev – zato pa imam memory limit nastavljen kar visoko.
Sam sem imel na enem siteu narejeno tako, da je ob userjevem requestu resizal iz originala, in potem spravil rezultat v memcache, in je delalo čisto ok. Seevda je pa vse odvisno od loada. Če imaš 100 rps, ki zahtevajo resize, to verjetno ne bo šlo na enem serverju. Če pa imaš bolj “blogerski” obisk, pa tudi če bi vedno vsako sproti resizeal ne bi bilo krize.
Žal tudi jaz najraje sam spišem kakšno skripto, tako da nimam izkušenj z dotičnimi plugini :).
Ampak kaj lahko gre narobe, če poskusiš???
Vsekakor je bolje, da se za eno sliko zadeva odvrti samo enkrat in ima nek efekt, ne pa da se zadeva vrti in vrti v čedalje večjem krogu brez nekega efekta, razen da ti provider teži :).
Have a nice day… JohnQ
Ponavadi sem skeptičen pri zadevah, kjer ne vem niti kaj vse gre lahko narobe :-)))
Vsekakor bi raje videl da nekdo pred mano že proba :-)))))
Hmm… pri image upload skripti po moje ne more iti nič narobe, razen da pač uploadaš eno sliko in vidiš to isto sliko pokvarjeno ali pa ne-resize-ano ali pa je sploh ne vidiš :) .
Po moje pa če poskusiš, boš videl, da ni vse tako črno, kot izgleda :) . Sem skoraj 100%, da ti plugini delajo. Če tvoja skripta dela, potem mora tudi plugin za WordPress, če uporablja iste GD funkcije.
Vsekakor pa prej narediš backup, da lahko zadeve povrneš v prvotno stanje ;).
Se pa najdejo na netu tudi plugini, ki ti obenem dodajo še watermark in podobne zadeve. Res luštno. V bistvu pa je to tvoja stvar, kako se boš odločil. Hočem samo pomagati ;)
Have a nice day… JohnQ
Fora je ker v bistvu ne pomagaš. Govoriš da obstajajo takšni in drugačni. To je jasno. Samo kateri je pa preiskušen in dober?
In kako se obnašajo pri recimo multiple uploadu? Pa da ni preveč sofisticiran, ki potem za vsako sliko teži da mu izbereš kako naj cropa. Ipd….
V bistvu se mi ne da s tem sploh zajebavat. Pri tem kar pa sam napišem pa točno vem kako in kaj dela.
dragi jeanmark… čutim neko napetost oziroma jezo v tvojih postih… se opravičujem, če sem jaz to povzročil s pametovanjem :) ampak takšen pač sem :) v tvoji skripti pač vidim velik problem v tem, da če jo poženeš dvakrat za isto mapo, si jo pognal enkrat preveč…. če že druga ne, si porabil elektriko za brezveze in s tem onesnažuješ okolje :) … bom poiskal in ti našel primeren plugin ki 100% deluje. Če potrebuješ samo image resize, bom našel ravno takšen plugin, da bo ob uploadu v WordPress resize-al slike na željeno velikost…
Pa brez zamere ;)
Have a nice day… JohnQ
Nič zamere, nič jeze. Ja, mi pa malce na qrac hodi, če mi kdo omenja da se da vse nekje dobiti. Vem da se da. Samo ne vem ali imam samo jaz to smolo, da med 10 open source add -oni nagazim na 10 takšnih, ki veliko obetajo, ptoem so pa crap.
Pa fino bi bilo, če omogoča tudi post festum resize. Če se kasneje premislim, in mi 1024 več ni ok, da lahko preidem na recimo 1600.