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>";