Народу уже неделю мучаюсь Следующий код должен контролируемо выдавать фаил! С контролем все ок .... но почему-то нестартует больше одного потока .... просто нет ответа и все тут! В чем может быть трабл ??? Вроде и файлов которые лочил бы нету скрипт сократил кактолько мог - для ловли ошибок PHP: <?php ignore_user_abort(true); error_reporting(E_ALL ^ E_NOTICE ^ E_WARNING ); $uniqID=uniqid(); // уникальный идентификатор текущего запуска скрипта header('Cache-Control: no-cache'); $timeStart=microtime(); $LOGS='';$LOGS.="\r\n Start at - ".$timeStart." ID[".$uniqID."] \r\n"; set_time_limit(0); // Определение констант define('SEGMENT',1024); // размер стандартного сегмента define('TIME_DELAY',1000); // задержка обработки для понижения скорости (1 сек = 1 000 000 микросекунд) define('DIRECTORY',getcwd()); // текущая дериктория define('DEBUG',0); $mime_type='application/octet-stream'; // Определение переменных $NoErrors=true; $HashOfFile=htmlspecialchars($_GET['file']); $_file=DIRECTORY.'/FILES/'.$HashOfFile; //Стартуем сессию дабы определить что именно этот клиент скачал именно этот фаил! ini_set("session.use_trans_sid",true); ini_set("session.use_only_cookies",false); session_name('sid'); session_start(); function CountSegments($fileofsegment){ // Подсчет размера отданной информации по сегментам $F=fopen($fileofsegment,"r") or error_log('can\'t open log file of segments', 0); if($F===false){error_log('can\'t read file of segments - '.$fileofsegment, 0);return 0;} $R=array(); while(!feof($F)){ $t=explode("\t",fgets($F, 4096)); if(isset($t[1])){$R[$t[0]]=((@(int)$R[$t[0]] < (int)$t[1]) ? $t[1] : $R[$t[0]]);} } fclose($F); ksort($R); $totalSize=0; foreach($R as $S => $length){if($totalSize > $S){if(( $S + $length) > $totalSize)$totalSize=$S + $length;}else{$totalSize+=$length;}} return $totalSize; } function write_to($mess) { // Логирование данных global $_file,$_SESSION,$_SERVER,$uniqID,$timeStart,$LOGS; $LOGS.=date("d.m.y H:i:s").'('.(microtime()-$timeStart).') - '.$_SERVER['REMOTE_ADDR'].' - SID:'.session_id().' - ID['.$uniqID.'] - file('.$_file.') - '.$mess."\r\n"; } function shdn(){ // функция выполняемая по окончанию выброса сигмента global $_file,$filesize,$_SESSION,$_SERVER,$NoErrors,$LengthSend,$rlow,$HashOfFile,$LOGS,$RootDir; write_to("shutdown function started"); file_put_contents(DIRECTORY.'/logs/'.session_id().".".$HashOfFile.".segment",$rlow."\t".$LengthSend."\n", FILE_APPEND); // Пишем сегмент - для накопления! $totalLoad=CountSegments(DIRECTORY.'/logs/'.session_id().".".$HashOfFile.".segment"); // Считаем все сигменты сегмент - для накопления! write_to("Loaded Segmen [".$rlow."]=>".$LengthSend); write_to("End Script: ".$totalLoad." ".(($totalLoad>=filesize($_file)) ? ">=" : "<")." total size: ".filesize($_file)); if((connection_aborted())||(connection_status()==2)){ write_to("connection ".(connection_aborted() ? "aborted" : (connection_status()==2 ? "connection_timeout" : "???"))); } else { write_to("valid connection shutdown"); if($totalLoad >= filesize($_file)){write_to("DOWNLOAD COMPLITE");} } $FH=fopen(DIRECTORY.'/logs/downloaded_count-'.date("d_m_Y").'.txt','a') or error_log('can\'t open log file', 0); if(fwrite($FH,$LOGS)===false){error_log('can\'t write log file', 0);}fclose($FH); } // обработка запрашиваемого заголовка на предмет фрагментарности if($_SERVER['REQUEST_METHOD']==='HEAD'){ $onlyHead = true;$rhigh = 0;$rlow = 0; }else{ $onlyHead = false; if (isset($_SERVER['HTTP_RANGE'])){ preg_match_all('/bytes=([0-9]*)-([0-9]*)/',$_SERVER['HTTP_RANGE'],$out); $rlow=$out[1][0]; $rhigh=$out[2][0]; write_to("Request Part (block:[$rlow]-[$rhigh] ) "); }else{write_to('Request without Part >>');} if(empty($rlow)){$rlow=0;} } $fileSize=filesize($_file);$LengthSend=0;$STRfilename=trim($_GET['file']); ob_start(); if($onlyHead){ // если от нас хотели только информацию о файле header("Content-Length: $fileSize"); header("Content-Disposition: attachment; filename=\"$STRfilename\""); }else{ // выдача запрошенного фрагмента header("Content-Type: $mime_type"); // формирование заголовков header('Accept-Ranges: bytes'); header('Connection: Keep-Alive'); header("Content-Disposition: attachment; filename=\"$STRfilename\""); if (isset($_SERVER['HTTP_RANGE'])){ // заголовки для фрагмента header('HTTP/1.1 206 Partial Content'); header('Content-Range: bytes '.$rlow.'-'.(!empty($rhigh) ? ($rhigh) : ($fileSize)).'/'.(!empty($rhigh) ? ($rhigh-$rlow) : ($fileSize-$rlow))); header('Content-Length: '.(!empty($rhigh) ? ($rhigh-$rlow) : ($fileSize-$rlow))); }else{ header("Content-Length: $fileSize"); // для тотального выброса } ob_flush(); for($i=$rlow;$i<=(!empty($rhigh) ? $rhigh : $fileSize);$i+=SEGMENT) { if(connection_status()==0){ $OUT=file_get_contents($_file,false,NULL,$i,SEGMENT); echo $OUT; ob_flush(); usleep(TIME_DELAY); if(connection_status()==0){ob_flush();$LengthSend+=strlen($OUT);} }else{write_to('Connection down');break;} } } ob_end_flush(); shdn(); set_time_limit(30); ?> Мдя ... рпишла в голову здоровая мысль!!!! попробовал - одновременно открыть данный фаил другим броузером (ака другой менеджер для скачивания) - ну икачает ... открывает он другой поток!!! но почему в регете-то второй поток нестартует ???? может всетаки блочится какой файлик ??? может сессия блочится ??? АААААААААААААААААААААА - нашел!!!!!!!!! (Session data is usually stored after your script terminated without the need to call session_write_close(), but as session data is locked to prevent concurrent writes only one script may operate on a session at any time. ) - тут матом можно ??? если в свой адрес ???[/i]