Upload velikih fajlova preko PHPa

Upload fajlove u PHP je generlno uradjen na potpuno pogrešan nacin. Pretpostavka da ceo POST mora da stane u memoriju je sumanut zahtev.

Potencijalna reshenja zahtevaju promenu nacina na koji se fajl uploaduje, ili zamenu PHPa sa PERLom (npr) na server strani samo za procesiranje uploada.

Pre jedno godinu dana sam video zanimljiv nacin za komunikaciju embeded uredjaja sa web serverom. Ukratko: celo telo zahteva zavrshi u PHPu putem php://stdin handlera. I sad ostaje samo dilema kako to iskoristiti da browser misli da radi klasican upload (ecntype=”multipart/form-data”), a da PHP php ne iskoristi svoj interni mehanizam za pakovanje celog zahteva u memoriju i parserovanje. I reshenje postoji, upotrebom dva standardna Apache modula modifikujemo content-type requesta tako da ne bude multipart/form-data shto ujedno znaci da PHP nece parserovati. I to se moze raditi:

SetEnvIf content-type (multipart/form-data)(.*) NEW_CONTENT_TYPE=multipart/form-data-alternate$2 OLD_CONTENT_TYPE=$1$2
RequestHeader set content-type %{NEW_CONTENT_TYPE}e env=NEW_CONTENT_TYPE

Potom sve shto je potrebno, je PHP kod koji parserije multipart/form-data interno i bez smeshtanja u memoriju.

Provereno sa nekoliko browsera, potrebno je još testiranja, ali rešenje je vishe nego lako primenjivo i ne zahteva nikakvo modifikovanje ni browser koda, ni PHP scripte za upload. A to je omogućeno preloadom .php fajla.

php_value auto_prepend_file php-uploader.inc.php

Jedina modifikacija PHP parametra je potreba da vreme izvrsavanja scripte bude dovoljno veliko da bi klient sa sporom konekcijom mogao da uradi kompletan upload.

Source kod kompletnog reshenja: https://github.com/zsteva/php-uploader.

I kod mene na serveru test lokacija http://zsteva.info/upload

This entry was posted in admin, linux, php. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *