PHP rychlá práce s obrázky Mozektevidi.net - Mozektevidi.net.

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.

image of PHP rychlá práce s obrázky

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 :).


autor článku OS | datum publikování 31.květen.2008 19:53 | služby a články co mohou být užitečné služby |

Kometáře

#1 lo3k wwwwww.pisem.cz

hmm... zajmavý, skusím si s tím doma pohrát :) reaguj

datum 31.05.2008 21:55

opera gnu-linux

#2 TondaD wwwblog.antonindanek.cz/

No co si budeme povídat. Načítat GD knihovnu (ImageCreateFromPNG), když si s tím obrázkem už stejně nic nedělal, jen ho odeslal tak jak jsi ho přijmul ... no zkrátka to bylo malinko zbytečný. :)

P.S.: Právě jsem zjistil, že sem píšeme dva Tondové, tak jsem upravil nick. reaguj

datum 01.06.2008 13:58

opera windows-xp

#3 MzK wwwmozektevidi.net

reakce na »TondaD«: Chybama se člověk učí. Já jsem na ten první (neefektivní) způsob přišel asi googlením výrazu „poslání obrázku na výstup php“ a nepřemýšlel nad výkonem.
Tonda jako Tonda :) nazory.5w.cz/autor/Tonda.html nazory.5w.cz/autor/TondaD.html Mohl bych rozlišovat podle IP (nejde, jedna IP má víc uživatelů a jeden uživatel má víc IP) nebo podle cookies (nespolehlivé, funguje jen na jeden počítač do reinstalace) nebo podle zadaného inputu WWW (taky nejde, dost lidí zadává víc webovek, snad kvůli PR… nebo registrace
Ale registrace jen kvůli přidání příspěvku je zbytečná a málokdo by to udělal.

BTW, ten kdo si změní nick mi připomíná „moudřejší ustoupí“ :D reaguj

datum 01.06.2008 15:01

opera gnu-linux

#4 Bagy wwwbagy.ic.cz

Co zkusit poslat header a pak precist obrazek readfile() ?

Sry jestli je to blbost nebo pomaly reaguj

datum 01.06.2008 20:33

firefox windows-xp

#5 Tonda wwwwww.netzona.cz

No super :) Vkon neni zadarmo a patrikvogl jede na mem serveru :D reaguj

datum 01.06.2008 23:25

firefox windows-vista

#6 TondaD wwwblog.antonindanek.cz/

reakce na »MzK«: To je pravda. Jak se říká: Z úspěchu se nic nenaučíš. :)

Taky u sebe na blogu používám identifikaci lidí podle jména (i když navenek žádný personalizovaný funkce nanabízim). Jedinej dobrej způsob je podle e-mailu. To pak ale člověk musí nastavit e-mail jako povinnou položku a nabídnout možnost skrytí, protože né každej chce svůj e-mail vystavovat na webu. reaguj

datum 01.06.2008 23:31

opera windows-xp

#7 setka www

Možná ještě o něco rychlejší by to mohlo být s funkcí readfile, která obsah souboru rovnou vysype na výstup, takže se nemusí ukládat do proměnné a pak vypisovat přes echo.
Minimálně spotřeba paměti bude menší, u malého souboru s obrázkem se to ale asi tolik neprojeví. reaguj

datum 07.06.2008 22:28

firefox windows-2000

#8 Tonda wwwwww.netzona.cz

reakce na »setka«:
Tak ono je jedno jestli pouzijes
readfile();
nebo
echo file_get_contents();

Stejne ta funkce ude jen symlink na file_get_contents, nebo v horsim pripade na fopen, s echem. reaguj

datum 10.06.2008 08:01

firefox windows-vista

Nové kometáře nejsou povolené.