PHP rychlá práce s obrázky (c) Oldřich Šálek

PHP rychlá práce s obrázky

Dnes jsem objevil obrovskou výkonovou ztrátu v souboru 404.php. Jak rychle přečíst a poslat na výstup soubor obrázku? Srovnání metod ImageCreateFromPNG, header a file_get_contents. Poslání obrázku na výstup přes PHP.

Výkon není zadarmo

Od jisté doby vím, že výkon není zadarmo a taky vím, že výkon není nekonečný. Se systémovými prostředky by se mělo šetřit. Když jsem koupil web patrikvogl.cz, zjistil jsem, že na ftp chybí spousty obrázků. Při načtení stránky je vidět spousty křížků informujích o chybějícím obrázku. Toho jsem se chtěl zbavit a proto jsem si vytvořil skript, který mi místo chybějícího obrázku podstrčí obrázek chybový (404.png).

$obrazek = ImageCreateFromPNG('css/404.png');
header('Content-Type: image/png');
imagepng($obrazek);
imagedestroy($obrazek); 

Skript byl hotový, víc jsem neřešil. Skript funguje. To jsem ještě nic netušil o optimalizaci PHP skriptů. Zjišťuji přes program ab (apache benchmarking), že 1000 *10 spuštění skriptu trvá neuvěřitelných 40sekund.

Řešení nevymýšlel dlouho, napadlo mne ihned.

header("Location: ".HOME.'404.png');
header("Connection: close");
die('nenalezeno'); // presmerovani proste nestaci. skript nesmi pokracovat dale

Prostě požadavek elegantně přepošlu na chybový obrázek. Stejným postupem jsem testnul rychlost přesměrování. Provedení skriptu 1000*10 krát trvá „jen“ 3,4 sekund. To by se dalo považovat za úspěch, ale mě napadlo ještě jedno řešení. Místo přesměrování budu otevírat klasický jako soubor.

$img = file_get_contents('404.png');
header('Content-Type: image/png');
echo $img;

Můj poslední skript je ještě o třetinu rychlejší. Trvá jen 2,1 sekund. S toho nelze než nemít radost :).

ico Oldřich Šálek | ico 31. května 08, 07:05 | ico služby | přečteno: 535x

Diskuze ke článku

Komentáře a diskuze ke článku tady
diskuze ke článku