Autor Zpráva
Dad
Profil *
Zdar,
vytvořil jsem si skript na upload obrázku, který upraví nahraný obrázek na zadané rozměry a vytvoři náhled, údaje uloží do databáze.

Narazil jsem ale na problém s nedostatkem paměti na serveru. Stránky jsou na hostingu s limitem 32MB. Při nahrávání obrázku většího než cca 1,5MB už ale skript spadne na řádku, kde je $fotka = imagecreatefromjpeg($cesta); a vyhodí chybu Allowed memory size of 33554432 bytes exhausted (tried to allocate 13056 bytes). I podle této hlášky to vypadá, že limit je 32MB.

Přijde mi ale divné, že pokud nahrávám menší obrázky a nechám si vypisovat echo memory_get_peak_usage(); bezprostředně po kritickém řádku, tak se nikdy nedostanu přes 16MB. Tady jsou hodnoty z testování (první je velikost nahrávaného souboru a druhá je memory peak).
1 418 638 13 577 824
1 488 965 14 277 112
1 572 639 Allowed memory size of 33554432 bytes exhausted (tried to allocate 13056 bytes)

Je chyba na straně hostingu, nebo to memory_get_peak_usage(); není vhodné pro tento účel?
AM_
Profil
Na kterém řádku? Kdyby byla chyba v samotném uploadu, asi by spadl hned při startu nebo by se vůbec nespustil. Předpokládám, že spíš někde ve skriptu s ním neefektivně nakládáš (je pravda, že obrázek je v paměti mnohem větší, než JPG na disku).
Mike8748
Profil
Dad
prvni vec je ze velikost souboru neurcuje jeho pametovou narocnost. obrazky (jpg, png,...) jsou komprimovany. kdyz si udelas JPG nebo PNG, rekneme rozmer 800x600, a vyplnis ho jednou barvou, tak na disku bude mit par kb, ale v pameti zabira kolem 1.5mb

druha vec je ze obrazek potom nactes do pameti, a pokud se to poradi (neprekrocis limit) tak pak musis v pameti vytvorit jeste jeden obrazek, do kteryho budes delat zmenseninu. to zabere dalsi pamet.

takze si bud nech na hostingu zvednou memory limit pokud to pujde, pokud to nepujde tak se smir s tim ze velky obrazky pomoci php a GD knihovny proste nezpracujes
Dad
Profil *
Padá to na řádku, kde je $fotka = imagecreatefromjpeg($cesta);
Hned potom je řádek echo memory_get_peak_usage();
Pokud se podaří fotku uložit (má méně než 1,5MB) tak memory peak dosáhne něco přes 14MB. Když dám ale obrázek nepatrně větší, u kterého bych předpokládal memory peak skriptu cca 16MB, tak to spadne. Ale limit by měl být 32MB. Kecá hosting, nebo memory_get_peak_usage()?
Mike8748
Profil
Dad
pochop ze nejde o to kolik kb/mb zabira obrazek na disku ale o to jaky ma rozmery v pixelech

a technickej detail: upload souboru neni nijak ovlivnej memory limitem. i pri memlimitu 32mb muzes uploadnout 100mb velkej soubor (pokud si upravis hodnoty max_post_size,...)
Alphard
Profil
Dad:
Ale limit by měl být 32MB. Kecá hosting, nebo memory_get_peak_usage()?
Když si nejste jistý, podívejte se na php_info(). Je tam uvedená správná hodnota. Jestli máte nastavených 16 mega, tak by bylo po záhadě.

pro výpočet nároků viz http://forum.php7.org/viewtopic.php?pid=6476#p6476

a ještě můžete zkusit funkci http://cz2.php.net/manual/en/function.memory-get-usage.php
Dad
Profil *
Mike
Chápu, ale především tu jde přece o to, kolik paměti zabírá skript. A já se ptám na to, jestli ta funkce memory_get_peak_usage(); vypíše údaj, kterému se dá věřit. Protože pokud ano, tak se limit tváří jako 32MB, ale chová se jako 16MB.

Zkusil jsem to ještě na jiném hostingu, ale tam to pro jistotu vyhodilo hlášku Call to undefined function: memory_get_peak_usage() .. ;o)

Jinak plně souhlasím s tím, že by uživatel měl fotky před uploadem upravit na normální velikost.
Dad
Profil *
Alphard
Díky za info, zařídím se. Btw. php_info() také hlásí 32MB.
Mike8748
Profil
pouzij memory_get_usage() spis


zacni tim ze si zjistis pixelovy rozmery danejch obrazku (ty co projdou a neprojdou) a porovnavej to. to jsou dulezity udaje.
Dad
Profil *
A je to,
výše uvedené tři soubory vypadají v porovnání pixelových rozměrů takto:
(poslední údaj je předpokládaný nárok na paměť podle vzorce z Alpharodovo odkazu)

1800x1350 asi 11 664 000
1850x1388 asi 12 325 440
3264x2448 asi 38 353 305

Takže nekacal ani hosting, ani funkce, ale můj předpoklad, kolik paměti zabere skript.
Díky, brou.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0