Скрипт, отдающий файл, лопает ресурсы.

kvazar

Guest
Скрипт, отдающий файл, лопает ресурсы.

Есть скрипт, который

1. Авторизовывает пользователя в LDAP
2. Отдает файл пользователю и понимает Partial Content


Все это благополучно работало, а с ростом нагрузки появились проблемы :-(

Есть предположение что скрипт лопает файл полностью(или ж сколько влезет), а потом отдает его пользователю. А так как качают некоторые еще и в несколько потоков - тормоза нынче получаются дикие.

Вот, ломаю голову как теперь сделать иначе :-(
Подскажите люди добрые - сталкивался может уже кто? :)
 

Tor

Новичок
kvazar
как читаешь и отдаешь файл?

Serguitar
чушь
не надо ограничивать удобства пользователя из-за кривизны собственных рук
 

kvazar

Guest
fopen - ом
отдаю ехом что прочел + огород про 206 Partial Content
 

kvazar

Guest
PHP:
$fsize = filesize($DirN); 
$ftime = date("D, d M Y H:i:s T",filemtime($DirN)); 
$hnl = fopen ($DirN,"r");

if ($HTTP_SERVER_VARS["HTTP_RANGE"]) { 
   $range = $HTTP_SERVER_VARS["HTTP_RANGE"]; 
   $range = str_replace("bytes=","",$range); 
   $range = str_replace("-","",$range); 
   if ($range) {fseek($hnl,$range);} 
   } 
$content = fread($hnl, filesize($DirN)); 
fclose($hnl); 
$etag = md5($DirN.$fsize.$ftime); 


if ($range) {header("HTTP/1.1 206 Partial Content");} 
else           {header("HTTP/1.1 200 OK");} 
header("Content-Disposition: attachment; filename=".$fflname); 
header("Last-Modified: ".$ftime); 
header("ETag: ".$etag.""); 
header("Accept-Ranges: bytes"); 
header("Content-Length: ".($fsize-$range)); 
header("Content-Range: bytes ".$range."-".($fsize-1)."/".$fsize); 
header("Content-type: application/octet-stream"); 
print $content;
 

Stadnitski Alex

Новичок
Можна отдавать файл так

PHP:
function handler($file)
{
    readfile($file);
    header("Pragma: no-cache");
    header("Content-Type: application/x-zip");
    header("Content-disposition: attachment; filename=$file");
}
 

Tor

Новичок
$content = fread($hnl, filesize($DirN));

читай по немногу, а не все сразу
 

SiMM

Новичок
Stadnitski Alex, головой уже пробовали думать? Иногда помогает - ваш код вообще лишён смысла.
 

SelenIT

IT-лунатик :)
Stadnitski Alex
Работает скорее всего благодаря буферизации вывода, без нее выскочит стандартная ошибка "Headers already sent". Но kvazarу это "решение" не поможет в любом случае - оно не может отдавать файл частями, а памяти жрет не меньше.


kvazar
Имхо, стоит попробовать [m]fpassthru[/m] вместо запоминания в $content, а если этого будет недостаточно - читать и тут же в цикле выводить небольшими порциями, тут же очищая буфер.
 
Сверху