Dlaczego nie trzymać plików w bazie?
Może dlatego, że w takim systemie dane przetwarzane są 3 razy. Najpierw baza musi je wysłać do drivera w języku serverside (PHP), później driver musi umieścić je w lokalnej strukturze danych (2 operacje kopiowania), na koniec dane trzeba przetworzyć i wysłać do przeglądarki. 3 razy to wersja bardzo optymistyczna, pomijająca operacje kopiowania danych występujące między userland a kernelem, które występują co najmniej dodatkowe 2 razy. Więc CPU zamiast robić cokolwiek pożytecznego w kółko przepisuje te same dane.
Jak to serwujesz normalnie to dane odczytujesz bez przetwarzania, bezpośrednio z dysku (cache), nie trzeba ich nawet nigdzie kopiować, "nowe" kernele (takie nowsze niż robiono 10 lat temu) mogą wysyłać dane bezpośrednio do interfaceu sieciowego z pominięciem userland.
Cytat
sendfile() copies data between one file descriptor and another. Because this copying is done within the kernel, sendfile() is more efficient than the combination of read(2) and write(2), which would require transferring data to and from user space.
Cytat
If your OS supports a sendfile(2) system call, make sure you install the release and/or patches needed to enable it. (With Linux, for example, this means using Linux 2.4 or later. For early releases of Solaris 8, you may need to apply a patch.) On systems where it is available, sendfile enables Apache 2 to deliver static content faster and with lower CPU utilization.
Druga sprawa to fakt, że trzeba ręcznie obsługiwać cacheowanie, niewielu ludzi potrafi zrobić to dobrze. A trzeci problem, to fakt że tak napisany skrypt nie obsługuje partial-content, więc jeśli np. na komórce padnie połączenie to trzeba będzie ściągać cały plik od nowa. Więc się skończy albo niedorobionym kodem, albo marnym wymyślaniem koła na nowo i implementowaniem podstawowych operacji HTTP (już widzę jak będzie z kompatybilnością takiej "rzemieślniczej" implementacji robionej przez kogoś, kto ma może na desktopie 3 przeglądarki + 2 komórki).
Na prawdę nie można chyba zrobić wiele głupszego, niż słać pliki z bazy (no chyba, że piszemy jakiś mikro-skrypt który odwiedza 30 ludzi dziennie). To świetny materiał na atak DOS. Jak ktoś się dowie, to może jednym łączem 128 kbit ubić cały serwer a być może i zamulić sieć usługodawcy po prostu inicjując requesty.
Już o backupach nie wspominając (taki plik w bazie, jako dump zajmuje 3-4x więcej miejsca na dysku)
Cytat
Wykonaj upload kilku gigabajtowego pliku przez http, omijając limity php.ini - większość dostawców nie zezwala na modyfikowanie ini, a jeśli już to nie pod takie wartości.
Serwer dedykowany w OVH kosztuje 15 złotych brutto, średni VPS 20. Plik można podzielić i przesłać.
Jak na dzielonym hostingu załadujesz do BLOB's nawet paręset MB crap'u to wylecisz po 10 minutach bo tak obciążysz system że od razu zauważą. Zwłaszcza, że w normalnych rozwiązaniach są dedykowane serwery DB... więc śląc ten crap w kółko po sieci tak im obciążysz linki że cię wywalą nawet zanim zauważą nadmierne obciążenie CPU i dysków.
BTW: Myślałem, że ten "dylemat" rozwiązano 10 lat temu

Po to się buduje szybkie serwery plików i rozwija kernele, żeby można było słać setki tysięcy statycznych plików na sekundę z jednej maszyny. Nie sztuka nakupić sprzętu za 100 tysięcy i go zamulić 50 transferami / s
http://lowlatencyweb.wordpress.com/2012/03...rvers-are-fast/http://www.techrepublic.com/article/use-se...-data-transfer/http://redmine.lighttpd.net/projects/1/wiki/Docs_Performancehttp://www.lighttpd.net/benchmark/Każdy nowocześniejszy serwer ma nagłówki, żeby serwowania plików nie robić z interpreterów po stronie serwera... a każdy nowocześniejszy OS obsługuje operacje atomowe na plikach, więc jedyna potencjalna zaleta bazy i tak tutaj odpada.
http://redmine.lighttpd.net/projects/1/wik...HTTPD-send-file