No spoko, możesz mieć, tylko żeby odczytać i przesłać plik:
Serwer www: określa świeżość, wysyła nagłówki, jeśli trzeba przesłać część pliku wysyła część. Co do samego przesyłu to AFAIR teraz dzieje się to praktycznie sprzętowo. Po prostu kernel z pominięciem warstwy użytkownika czyta plik i operuje bezpośrednio na buforze karty sieciowej (różnice dochodzą do 300%). Na pewno w pewnych wypadkach serwery mogą pomijać cache OS.
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.
Zapraszam tutaj, różnice mogą być kolosalne:
http://www.lighttpd.net/benchmark/http://linuxgazette.net/issue91/tranter.htmlhttp://stackoverflow.com/questions/3251327...ce-file-servingCytat
On systems where it is available, sendfile enables Apache 2 to deliver static content faster and with lower CPU utilization.
Teraz zobaczmy jak ty chcesz to zrobić:
1. Najpierw przesyłasz plik z serwera bazodanowego do klienta (PHP), programowo, być może zapisujesz jeszcze to co otrzymałeś w cache bazy chociaż sam plik bazy jest już przechowywany przez cache systemu plików.
2. Trzeba jakoś te dane obrobić po stronie PHP, żeby je umieścić w zmiennej czy tablicy. Następne kopiowanie.
3. Zamiast małego (kilkadziesiąt KB) bufora potrzebujesz: rozmiar_pliku x 2-4 pamięci RAM. Bo fcgi czy apache też musi gdzieś trzymać to co wypluje PHP zanim to wyśle ... =>
4a. Teraz to musisz wysłać do przeglądarki. Jak masz jakiś szybki serwer typu lighty albo nginx działający w FCGI to jesteś totalnie w dupie bo ten 1MB danych ci się zapisze na dysku (albo co gorsza w pamięci). I będziesz miał masę
wątków przepychających gigabajty tych samych danych zapisanych na dysku albo w pamięci tymczasowej.
4b. W jeszcze większej dupie jesteś jeśli używasz apache i mod_php... bo nie dość że marnujesz megabajty ramu to jeszcze każdy obrazek się wysyła jako oddzielny proces. I masz masę procesów które jedyne co robią to przepychają ogromne ilości danych (znaczy nie robią nic, kopiują dane z jednego miejsca w drugie miejsce a potem w trzecie).
Tak szczerze to nie wiem co gorsze.
5. Musisz dorobić jakieś sprawdzanie świeżości, nagłówki, etc. Przez expiry czy etag, no dobra to jedno pole w bazie, ale niepotrzebna robota. A jak ci przeglądarka będzie chciała pobrać jedynie część pliku to już nie jest tak prosto. Poza tym baza najpierw całego tego ogromnego BLOB-a będzie musiała przetworzyć*
6. W odróżnieniu od PHP które masz share-nothing kiedy czytasz bądź zapisujesz "pliki" do tej bazy będziesz zatrzymywany na globalnych MUTEX-ach. Więc wydajnie to wykorzystasz jeden, najwyżej dwa rdzenie CPU.
7. Najlepsze jest to, że masz do wyboru myisam, które się nie nadaje do zapisu czegoś takiego bo przy każdym zapisie pliku będziesz przycinał odczyty. Albo innoDB w którym bloby działają nawet do 2 razy mniej wydajnie. Do tego w obu przypadkach totalnie zaśmiecisz cache mysql-a czymś co system operacyjny i tak będzie miał w pamięci.
Cytat
* MySQL internally has no optimizations to read portions of the blob – it is either read completely or not at all
http://www.mysqlperformanceblog.com/2010/0...rage-in-innodb/Tak można byłoby trzymać pliki, jeśli server BD działałby w trybie bezpośredniego dostępu do dysku i miał wbudowany serwer HTTP i nie zaśmiecał tym cache kwerend.
Ty chcesz w wolnym PHP robić to co w szybkim C jest 3 razy wolniejsze. I to w najgorszy możliwy sposób (bo na procesach), obojętnie czy fcgi czy mod_php. Zanim osiągniesz 20% wydajności karty sieciowej to albo cię mutex-contention w mysql-u dopadnie i ludziom przestaną się wyświetlać losowe obrazki (i losowe URL-e) albo tym serwer ubijesz.
Inna sprawa, że jeśli masz bardzo mało użytkowników, to nawet coś zaimplementowanego w tak kolosalnie nieoptymalny sposób nie stanowi problemu. A PHP też ma wbudowany webserver, tylko że jakoś nikt go do poważnych zastosowań nie planuje używać

>Na korzyść przechowywania plików w bazie przemawia również to, że masz dokładnie takie same zabezpieczenia dla tego "pliku", jak i dla całej bazy
Tak, ale to tylko dla małych projektów ma sens (i jeszcze jeśli admin jest "lewy")

>Poza tym niektóre hostingi ograniczają ilość miejsca na pliki, za to w bazach - hulaj dusza...
Niestety, będzie jakiś wykop-efekt, to w 5 minut wylecisz. Hosting plików w porównaniu z hostingiem baz jest cholernie tani. Żeby zahostować 2TB plików to ci wystarczy dedyk za 90 złotych miesięcznie z jakimś nginxem i prockiem 2 core, żeby zahostować 2TB baz... to nawet nie wiem co byś musiał mieć

Stawiam, że ten sposób może działać nawet 20-100 razy (!) wolniej. Z resztą to ciekawy temat jak skończysz może jakich benchmark zapuścisz?
W ogóle zastanawiałeś się jak się będą wlec backupy czegoś takiego (mysqldump zapisuje dane binarne w formie tekstowej, więc jeszcze ci urosną o 30-40%). Z tego co wiem to bodajże SQL Server ma nawet typ danych który jest przeznaczony do zapisywania plików w bazie. Znaczy po prostu zapisuje te pliki na dysku a później dołącza do odpowiedzi.