Доброго времени суток! Интересует вопрос ограничения скорости отдачи файла скриптом, получаемого через fsockopen до 50 кб/с Вот собственно код: PHP: <?php $sock = @fsockopen($server, 80, $errno, $errstr, 30); if(!$sock) { die('Cannot create socket! Error was: ' . $errstr); } $request = "GET /path/to/file HTTP/1.1\r\n"; $request .= "Host: $server\r\n"; $request .= "Accept: */*\r\n"; $request .= "Connection: close\r\n"; $request .= "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7\r\n"; $request .= "Cookie: " . file_get_contents($cookies) . "\r\n"; if($_SERVER['HTTP_RANGE']) { $request .= "Range: {$_SERVER['HTTP_RANGE']}\r\n"; } $request .= "\r\n"; fwrite($sock, $request); $line = fgets($sock); while($line != "\r\n") { $line = fgets($sock); } $_SERVER['HTTP_RANGE'] ? header('HTTP/1.1 206 Partial Content', true, 206) : header('HTTP/1.1 200 OK', true, 200); header("Content-Disposition: attachment"); header('Content-type: audio/mpeg'); header('Content-Length: '.$content_len); header('Accept-Ranges: bytes'); header('Connection: close'); $time_discret = 1; $download_speed = 51200; while(!feof($sock)) { $time_start = microtime(true); echo fread($sock, ceil($download_speed*$time_discret)); flush(); $time_end = microtime(true); $time = $time_end - $time_start; if($time_discret-$time > 0) usleep(($time_discret-$time)*1000000); } fclose($sock); ?> проблема заключается в том, что скрипт первые пару секунд отдает файл на скорости около 40 кб/с а потом практически ничего не отдает (или отдает на нереально мизерной скорости). Проснифферив запросы вычислил что скрипт всегда скачивает максимум 234.86 кб файла и дальше ни в какую не идет. Подскажите, в чем может быть проблема?
igordata по идее она выжидает определенное время перед тем как отправить следующий кусок данных - в данном случае секунду пример скрипта брал отсюда http://shaman.asiadata.ru/node/311
ну и ужас. некоторые переменные неопределыны. попробуй удалить это зы. автор не знает о do...while а зря
Mr.M.I.T. мне же ненадо отдавать заголовки полученные с сервера в теле файла, а нужно только данные. если убрать этот кусок нужно будет каким-то образом перематывать указатель в начало данных в сокете
изменил $discret_time на 0.1 - отдавать стало на нужной скорости но коннект в fsockopen рвется после получения 1.41-1.43 мб файла. в чем может быть проблема? UPD: включил все ошибки и разобрался - "Maximum execution time of 30 seconds exceeded"
PHP: <? while (!feof($sock)){ echo fread($sock, $download_speed); ob_flush(); flush(); sleep(1); // в секундах, да }
alBoo я конечно понимаю что юзать модули сервака для такой задачи более верно, НО когда используется хостинг и доступа к конфе сервака разумеется нет, то приходится изобретать велосипед из подручных доступных средств lexa к сожалению в секундах нельзя..нужный эффект не достигается(( по сабжу - проблему решил если кого интересует код то вот: PHP: <?php set_time_limit(0); $sock = @fsockopen($server, 80, $errno, $errstr, 30); if(!$sock) { die('Cannot create socket! Error was: ' . $errstr); } $request = "GET /path/to/file HTTP/1.1\r\n"; $request .= "Host: $server\r\n"; $request .= "Accept: */*\r\n"; $request .= "Connection: close\r\n"; $request .= "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7\r\n"; $request .= "Cookie: " . file_get_contents($cookies) . "\r\n"; if($_SERVER['HTTP_RANGE']) { $request .= "Range: {$_SERVER['HTTP_RANGE']}\r\n"; } $request .= "\r\n"; fwrite($sock, $request); $line = fgets($sock); while($line != "\r\n") { $line = fgets($sock); } $_SERVER['HTTP_RANGE'] ? header('HTTP/1.1 206 Partial Content', true, 206) : header('HTTP/1.1 200 OK', true, 200); header("Content-Disposition: attachment"); header('Content-type: audio/mpeg'); header('Content-Length: '.$content_len); header('Accept-Ranges: bytes'); header('Connection: close'); $time_discret = 0.1; $download_speed = 51200; while(!feof($sock)) { $time_start = microtime(true); echo fread($sock, ceil($download_speed*$time_discret)); flush(); $time_end = microtime(true); $time = $time_end - $time_start; if($time_discret-$time > 0) usleep(($time_discret-$time)*1000000); } fclose($sock); ?>
вот если бы ещё память ограничить у мея свой модуль для отдачи но память readfile забивает если файл на гиг - он его целиком в оперу загружает... вот это бы исправить
dj--alex PHP: <?php $f = fopen('/path/to/file', 'r') or die('Can\'t find the file!'); while (!feof($f)) { echo fread($f, 128 * 1024); // Read and give out 128KB chunk } fclose($f); Очевидно, нет? Output buffering естественно должен быть отключен.
fread() reads up to length bytes from the file pointer referenced by handle. Reading stops as soon as one of the following conditions is met: - length bytes have been read - EOF (end of file) is reached - a packet becomes available (for network streams) - 8192 bytes have been read (after opening userspace stream) А этот юзеспейс стрим это что?
не помогает $f = fopen($file, 'r') or die('Can\'t find the file!'); while (!feof($f)) { echo fread($f, 16 * 1024); // Read and give out 16KB chunk ob_flush (); } fclose($f); даже так не работает , мгновенно исчезают 2 гб оперативы 3 скачки - 6гб оперативы . более скачек - комп дико лагать и тормозить начинает причем он их ещё и кэширует в памяти т.е. если в первый раз скорость была 30мб\с то в следующие разы она почти в 3 раза выше - уже 80мб\с .... попробовал класс отсюда... http://www.php.ru/forum/viewtopic.php?t ... 787be8d09b использовал так... $object = New download ($file,$name=$filename, $resume=1, $max_speed=0); // echo $object->name; $object->download_file (); память вроде перестала пропадать..то что надо!!! проблема решена, спасибо!!!