[ dejan @ 14.10.2003. 15:00 ] @
Interesuje me par stvari vezano za download kada se link skriva na ovaj nacin:

Code:

header("Content-Type: application/force-download");
header("Content-Transfer-Encoding: Binary");
header("Content-Length: ".filesize("../$file"));
header("Content-Disposition: attachment; filename=\"".basename($file)."\"");
readfile("../$file") or die ("File read error");
exit;


1. Koliko to opterecuje server? U pitanju ce nekad biti fajlovi od po nekoliko stotina MB pa ne bi bas hteo da mi server puca ili sta vec...

2. Kako mogu u tom slucaju (posto sve ide preko HTTPD-a) da pratim "zauzetost" servera, ogranicim broj downloada i sl?
[ Goran Rakić @ 14.10.2003. 22:16 ] @
isto je kao i da download-uješ direktno. I jedno i drugo ide preko HTTPD-a. Razlika je jedino u tome što u slučaju bez php-a je HTTPD taj koji čita fajl sa diska, a ovde to radi php. Razlika u brzini je razlika u brzini obrade kroz php > libc, odnosno direktne obrade preko libc funkcija, što ne bi trebalo da bude velika razlika. E sada... implementacija readfile funkcije može da predstavlja problem, (ukoliko sve učita u memoriju pa onda lupi korisniku kroz TCP socket) ali ne verujem da tako radi, već mislim da funkcioniše tako što čita neki deo pa to prosledi i tako redom.
[ -zombie- @ 15.10.2003. 15:44 ] @
pa.. ima tu još jedna začkoljica osim te da li readfile() čita sve u memoriju (što se može proveriti, a i ako čita, može se uvek koristiti fopen() fread($fp, 4096) ili šta već).

ta druga stvar je to što ako su stvarno fajlovi tako veliki, velika je šansa sa prenos podataka u jednom trenutku pukne, pa bi valjalo da on može da se nastavi.

sa ovim jednostavnim kodom se to neće desiti, nego će download početi isponova.


da bi ovo implementirao, moraš da proveriš da li je u zahtevu poslat Range heder (valjda "Range: bytes=100-200" ili slično. potraži u http/1.1 rfc-u), pa ako jeste, da pošalješ samo zahtevani deo fajla (shvatićeš već detalje iz dokumentacije)
[ dejan @ 17.10.2003. 13:09 ] @
Da, shvatam da bi ne bi bilo resume opcije u slucaju puknutog downloada, sto mi i nije toliki problem.

A znaci kako bi mogao da kontrolisem kolicinu downloada u svakom trenutku? Nesto tipa kao sto kod FTP-a moze da se definise maximalni broj konekcija i sl?
[ stanoje @ 23.10.2003. 13:17 ] @
Citat:
dejan:
Da, shvatam da bi ne bi bilo resume opcije u slucaju puknutog downloada, sto mi i nije toliki problem.

A znaci kako bi mogao da kontrolisem kolicinu downloada u svakom trenutku? Nesto tipa kao sto kod FTP-a moze da se definise maximalni broj konekcija i sl?


broj konekcija ide tako sto update u bazi na pocetku broj konekcija za 1
tj UPDATE konekcije SET brk=brk+1
a posle toga(na kraju skripta)
kazes
UPDATE konekcije SET brk=brk-1
Sad tu imades stvar poznatu kao race condition koja je ovako malo smanjena jer SQL radi pos'o, tj ne cupas sa php-om uvecavas za jedan pa updatujes. Jos jedna stvar morao bi da LOCK-ujes tu tabelu jer zamisli situaciju kad imas dva php skripta koja se izvrsavaju u slicnim vremenima.

Last but not the least, sto ne pustis Apache-u da radi svoj poso
(vidi Header("Location:") f-ju), jedino je opravdanje da nesto hoces da zabranis, naplatis,ogranicis kod downloada.
E kad se vec zezas ta time onda bi mogao da vidis i da li Header("Location:") podrzava Range:bytes=x-y, pa da podelis ovde sa nama to. Ideja je da php-om samo prihvatis zahtev, da ga onda preusmeris HTTPD-u sa sve Range headerom.
[ kizo001 @ 23.11.2003. 13:37 ] @
Kako da pokraj fajla koji mi je za download stavim brojac koliko je puta skinut taj fajl? Ako tko moze odgovoriti, ali da malo bolje objasni. HVALA