ugrás a tartalomhoz

Extra hosszú POST adatok küldése

hovszabolcs · 2013. Jan. 21. (H), 17.08
Sziasztok!

Egy olyan jellegű kérdésem lenne, hogy ha van egy formom és egy jókedvű felhasználó a név mezőhöz (egy program segítségével) egy 7 MB hosszú "nevet" küld, akkor annak milyen következményei lehetnek? Egyáltalán string/array-ként lehet ilyen hosszú adatot küldeni?
Attól tartok, ha ilyen bekövetkezik, akkor jön a hibaüzenet, hogy nincs elég memória, vagy ilyesmi.
Van alapja az aggodalmamnak?

Válaszotokat előre is köszönöm!

Szabolcs
 
1

konfiguráció

Poetro · 2013. Jan. 21. (H), 17.17
Ez leginkább a PHP.ini konfigurációs változó kérdése. A post_max_size változó szabályozza, hogy maximálisan mekkora adatot lehet POST-olni. Ez hatással van a szkript memória igényére is, mert létre fog jönni egy ekkora méretű változó is (és igen, lehet egy változó mérete 7MB, amennyiben ezzel az alkalmazás nem lépi túl a maximális memória mennyiséget). Ha túllépi ezzel a maximálisan POST-tal küldhető adatmennyiséget akkor a $_POST illetve $_FILES globális változók üresek lesznek. http://php.net/manual/en/ini.core.php#ini.post-max-size
2

Futásidőben létrehozott változók

hovszabolcs · 2013. Jan. 21. (H), 17.49
Ha jól értelmezem, akkor ez így néz ki:
memory_limit <= post_max_size <= upload_max_filesize
3

memory_limit >= post_max_size

Poetro · 2013. Jan. 21. (H), 17.55
memory_limit >= post_max_size >= upload_max_filesize
4

Bocsánat!

hovszabolcs · 2013. Jan. 21. (H), 18.09
Így gondoltam, nem is tudom, hogy hogy írhattam fordítva egy egyszerű relációt...
Tehát akkora fájlt tölthetek fel max, amekkora belefér a memóriába. :-)
Ez olyan, mintha azt mondanám, hogy traktor legyen nagyobb, mint a szántandó föld. :-)

Ez most több kérdést is felvet:

1. Ha feltöltéskor nem töltődik be a fájl a memóriába (aminek nem is látnám értelmét), csak a temp-be, akkor mi értelme a memória méretére korlátozni azt?

2. Ha a (feltöltött anyag mérete + a script memóriában elfoglalt mérete) == max_memory_limit, akkor ha épp létrehozok egy bolhafingnyi változót már leáll a script hibával. Már csak byte-onként kell növelnem az elküldött anyag méretét és sorról-sorra okozhatom a hibákat, amíg valami helyrehozhatatlan hibát nem okozok?

Mert nekem az lenne a normális, ha kicsire vehetném a memóriába bevitt adatok méretét és nagyra a feltölthető fájlok méretét.
5

Még mindig nem :)

Pepita · 2013. Jan. 24. (Cs), 01.02
A szántóföld nagyobb mint a traktor, a traktor meg elbírja az ekét... :)
Hogy lett a név mezőből fájl?

1. Egyszerre jön az egész _POST a tempbe, ezért a post_max_size. A fájlméret a feldolgozás memóriaigénye (és más okok) miatt külön korlátozható az upload_max_size -al. A memóriakorlátozás meg azért van, hogy a szkripted ne tudja megenni a szervert (elférjen a traktor a szántóföldön). Mivel ezek a direktívák egymástól függetlenül beállíthatók (php.ini), igen, be lehet állítani hülyeséget is. Akkor is a szigorúbb fog korlátozni. (Pl. post_max_size < upload_max_size -> hülyeség, mert a képhez még szöveget is akartak postolni.) Nem korlátozza a PHP a feltöltött fájl méretét, hanem feltölti, ha lehet, avagy eldobja. Viszont a feltöltés végeztével a te szkriptednek kell átmozgatnia a temp könyvtárból a végleges helyére, ahhoz viszont memória kell. (Értelmes szerverbeállítás: a szkripted futása után a PHP törli a temp-et. De ez nincs mindenütt így.)

2. Az 1-ből kitűnik: amikor a nagy fájllal dolgozol, kell a sok memória. De a memory_limit tudtommal ini_set()-el is állítható, csak előbb kell beállítanod, mint felhasználni a nagyobb RAM-ot. Én legalábbis úgy emlékszem, hogy db mentéskor már használtam, meg képműveleteknél is. Olvass utána manual-ban, mert valóban hasznos, ha általában spórolsz a vassal, de fájlkezeléskor kell tudnod "izmosítani".
6

Az átmozgatáshoz speciel nem

Joó Ádám · 2013. Jan. 24. (Cs), 01.52
Az átmozgatáshoz speciel nem kell memória :)
7

Igaz, bocsi, de

Pepita · 2013. Jan. 24. (Cs), 02.25
mondjuk én nem emlékszem olyanra, hogy minden művelet (főleg ellenőrzés) nélkül pusztán átmozgattam volna Júzertől feltöltött fájlt... Ehhez pedig már "el is kell olvasni", pláne ha vmi okosabb szűrést akarsz végrehajtani rajta/benne. Nem akartam a választ ezzel bonyolítani.
9

Szerintem nem feltétlenül

hovszabolcs · 2013. Feb. 15. (P), 17.43
Szerintem nem feltétlenül kell betölteni az egész fájlt, ahhoz hogy ellenőrizd - használhatsz puffert is.
10

Ha te írod meg...

Pepita · 2013. Feb. 15. (P), 19.05
Én mondjuk a használt fw megfelelő osztályát használom feltöltéshez, de most (majd) át fogom nyálazni a kódját, nehogy nagy fájloknál felzabálja nekem a memóriát...
8

A szántóföld még mindig traktor méretű

hovszabolcs · 2013. Jan. 25. (P), 14.33
Nem lehet nagyobb a fájlod, mint a megengedett memória - ez nekem eleve ellentmondásos.
Értem, hogy POST-ban van a fájl is, de meg tudja különböztetni. Ha fájl, akkor nem tölti be a memóriába, hanem a temp-be rakja. Ez így is van rendjén.
De (!), mi van akkor ha:

1; azt szeretném, hogy a POST adatok max. 200Kb-ot foglalhassanak a memóriában, mert nem akarom, hogy Hekker Józsi küldjön nekem egy 8MB-os textfield-et, amitől kiakasztja a programot, viszont szeretnék akár 500Kb-os képeket is feltölteni.

2; hostolnának nekem egy 100GB-os tárhelyet, ahová a felhasználók filmeket szeretnének feltölteni - nem fog menni nekik, mert nincs elég "memória" a film feltöltéséhez? (Vagy esetleg a post-max-size-ot beállítom 12GB-osra, ami több a memória méreténél és úgy mindenkit kiszolgálok, mert nem csak a felhasználók tudnak 12GB FullHD filmeket feltölteni, de HackerJózsi és csapata is tud 12GB méretű textfieldet küldeni, amit a php azonnal betölt a memóriába.

Szóval ezeket nem értem én mindet. :-)

Egyébként nem tudom, hogy mekkora puffert használ a php egy fájl másolásához, de régen 64Kb elég volt. Nem kellene, hogy sok memóriát egyen, ha igen, akkor +1 issue.
11

Idézet

Pepita · 2013. Feb. 15. (P), 19.10
A - magyar nyelvű - manual írja (fájlfeltöltés/tipikus csapdák):
Ha a memóriakorlát be van állítva, esetleg növelni kell a memory_limit értékét. Gondoskodni kell a memory_limit kellően nagyra állításáról!
Tehát innentől nem tudom, hogy Ádámnak van-e igaza vagy Poetronak és nekem. (Gyanítom, hogy Ádámnak, hátha a PHP kötegelt feldolgozással másolja.)

1.: A POST-olt űrlapadatokat szerveroldalon ellenőrizd (űrlapmezőnként), így karakterre pontosan tudod korlátozni pl. a texteket. De sok más dolgot is ellenőrizhetsz (pl. mime type, fájlméret), a direktívákat meg állítsd olyan nagyra, hogy ha az összes adat maxi, akkor is kényelmesen beférjen (kicsit rászámolhatsz, ha pl. a textet levágni akarod, nem eldobni a teljes POST-ot).

2.: Mint 1-ben, ne mindent php.ini-ben akarj megoldani. Van egy-két dolog (pl. memory_limit), amit szkripten pelül is tudsz állítani, de egy csomót csak php.ini-ből, ezek a beállítások az egész site-ra érvényesek lesznek. De más okokból is (XSS, stb.) fontos a feldolgozáskori szűrés, ezek a méretdolgok könnyűek. Szóval próbáld ki úgy, hogy csak a post_max_size és az upload_max_filesize értékét állítod elég nagyra, majd meglátod, hogy műxik-e. Javaslom, hogy teszt alatt mérdd a memóriát.

Szerk.: fontos még a feltöltési idő, szkript futásidő is. Ha csinálsz méréseket, megoszthatnád.
12

Én csak azt írtam, hogy

Joó Ádám · 2013. Feb. 15. (P), 21.17
Én csak azt írtam, hogy miután lemezre került a fájl az ideiglenes könyvtárban, onnantól az átmozgatáshoz nem kell memóriába olvasni, csak a nevét átvezetni a másik könyvtárba.

A feltöltés esetén természetesen szükség van a memóriára, igaz, ilyenkor is lehet részenként fogadni és azonnal lemezre írni.
13

Jogos,

Pepita · 2013. Feb. 18. (H), 20.16
én értettem félre, de így tiszta.