PHP upload progress
Sziasztok,
PHP upload progress témában szeretnék frissített beszámolót adni, illetve tapasztalatot cserélni, ha valaki azóta esetleg (újra) elővette a témát.
Aki nem lenne képben, annak a lényeg összefoglalva az, hogy ilyet tisztán php-val alapból nem lehet csinálni, csak azóta a dolgok változtak. Eddigi topikok itt a weblaboron: egy két évvel korábbi, aminek az alján összegzem az addigi eredményeket, illetve két héttel ezelőtt is feljött a kérdés.
Nos, azóta a PHP 5.2-től kezdve lehetővé vált tiszta php-s megoldás, ha nem is alaptelepítéssel. Két PECL csomagról van szó, az egyik az APC, ami örvendetes, mert egy nagy és jól karbantartott modul, és ha jól tudom, a 6-os PHP-tól már a core-ban lesz. A másik az uploadprogress.
Mindkettő használata egyszerű, a fájlt felküldő formban a file inputja elé kell tenni egy hidden inputot egy speciális névvel (APC_UPLOAD_PROGRESS, ill. UPLOAD_IDENTIFIER) a name, valamint egy egyedi azonosítóval a value attribútumban. A form submitja után a megadott kulccsal azonnal lekérhetők a feltöltés folyamatának az információi (apc_fetch($kulcs), ill. uploadprogress_get_info($kulcs) ajaxszal vagy iframe-es/popup-os frissítgetésekkel; további információk a php.net apc oldalán, illetve az uploadprogress-ről itt).
Mindkét modul a POST méretét adja vissza, nem a pontos fájlméretet.
A tapasztalataim a következők. APC-vel minden szépen működik, egészen addig, amíg nagy fájlt nem töltünk fel. Sokáig azt hittem, kliensoldalon van a gond, de végülis egy kis loggolással és Firebuggal lekövettem, hogy sajnos nem. A feltöltés megkezdésétől kezdve pontosan 1 óra múlva ugyanis eltűnik a feltöltésről információkat adó apc kulcs, a lekérdezés false eredményt ad vissza. (A feltöltés egyébként rendben végbemegy.) Körülnéztem az APC konfigjában egy órás érték után kutatva, s találtam is egy paramétert, aminek default értéke 3600 másodperc (apc.gc_ttl), de ennek nem sok köze lehet a problémához, és ezt azóta teszt is megerősítette. Így marad a feltételezés, hogy ez apc bug, amit ha nem cáfog meg senki, küldöm reportba.
Közben az uploadprogress felé vettem az irányt, kissé fanyalogva, merthogy még mindig beta, és nincs hozzá gentoo csomag ;). Persze különösebb gond nélkül pecl-lel felraktam, de sajnos többet nem is tudok róla mondani, mert mindezek ellenére nem sikerült beüzemelnem. Phpinfo-ban ott virít, de még a példaszkriptekkel sem működik. Itt nyilván nálam van a gond, de azért rejtélyes.
Eléggé elkeserítő, hogy egy ilyen alapvető problémát nem sikerült még mindig kielégítően megoldani php-s kereteken belül, és csak emiatt flashes vagy más külső segítséghez kell folyamodni, pedig szerintem elég prioritásos dolog.
■ PHP upload progress témában szeretnék frissített beszámolót adni, illetve tapasztalatot cserélni, ha valaki azóta esetleg (újra) elővette a témát.
Aki nem lenne képben, annak a lényeg összefoglalva az, hogy ilyet tisztán php-val alapból nem lehet csinálni, csak azóta a dolgok változtak. Eddigi topikok itt a weblaboron: egy két évvel korábbi, aminek az alján összegzem az addigi eredményeket, illetve két héttel ezelőtt is feljött a kérdés.
Nos, azóta a PHP 5.2-től kezdve lehetővé vált tiszta php-s megoldás, ha nem is alaptelepítéssel. Két PECL csomagról van szó, az egyik az APC, ami örvendetes, mert egy nagy és jól karbantartott modul, és ha jól tudom, a 6-os PHP-tól már a core-ban lesz. A másik az uploadprogress.
Mindkettő használata egyszerű, a fájlt felküldő formban a file inputja elé kell tenni egy hidden inputot egy speciális névvel (APC_UPLOAD_PROGRESS, ill. UPLOAD_IDENTIFIER) a name, valamint egy egyedi azonosítóval a value attribútumban. A form submitja után a megadott kulccsal azonnal lekérhetők a feltöltés folyamatának az információi (apc_fetch($kulcs), ill. uploadprogress_get_info($kulcs) ajaxszal vagy iframe-es/popup-os frissítgetésekkel; további információk a php.net apc oldalán, illetve az uploadprogress-ről itt).
Mindkét modul a POST méretét adja vissza, nem a pontos fájlméretet.
A tapasztalataim a következők. APC-vel minden szépen működik, egészen addig, amíg nagy fájlt nem töltünk fel. Sokáig azt hittem, kliensoldalon van a gond, de végülis egy kis loggolással és Firebuggal lekövettem, hogy sajnos nem. A feltöltés megkezdésétől kezdve pontosan 1 óra múlva ugyanis eltűnik a feltöltésről információkat adó apc kulcs, a lekérdezés false eredményt ad vissza. (A feltöltés egyébként rendben végbemegy.) Körülnéztem az APC konfigjában egy órás érték után kutatva, s találtam is egy paramétert, aminek default értéke 3600 másodperc (apc.gc_ttl), de ennek nem sok köze lehet a problémához, és ezt azóta teszt is megerősítette. Így marad a feltételezés, hogy ez apc bug, amit ha nem cáfog meg senki, küldöm reportba.
Közben az uploadprogress felé vettem az irányt, kissé fanyalogva, merthogy még mindig beta, és nincs hozzá gentoo csomag ;). Persze különösebb gond nélkül pecl-lel felraktam, de sajnos többet nem is tudok róla mondani, mert mindezek ellenére nem sikerült beüzemelnem. Phpinfo-ban ott virít, de még a példaszkriptekkel sem működik. Itt nyilván nálam van a gond, de azért rejtélyes.
Eléggé elkeserítő, hogy egy ilyen alapvető problémát nem sikerült még mindig kielégítően megoldani php-s kereteken belül, és csak emiatt flashes vagy más külső segítséghez kell folyamodni, pedig szerintem elég prioritásos dolog.
CVS-ben javítva