Как обойти таймаут при отдаче файла?

Статус
В этой теме нельзя размещать новые ответы.

kanaris

Новичок
Как обойти таймаут при отдаче файла?

Добрый вечер, всех с праздником.

Хостер ставит ограничение по времени на выполнение php-скриптов - 30 сек, обойти его set_time_limit или через .htaccess нельзя. Скрипт качает файло с одного сервера, и на ходу (т.е. без промежуточного сохранения на сервере) отдает его клиенту. Используются сокеты, поддержка докачки предусмотрена. Поскольку файлы большие, за 30 секунд они не успевают перекачаться и обрывается работа скрипта.

Подскажите пожалуйста, как можно отдавать файл частями? Чтобы когда закончился таймаут, клиент снова послал запрос на скачивание с оборванного места?

Вот кусок скрипта:

PHP:
	function transfer($host,$folder,$filename,$att){
		/*
		
		сначала юзер посылает нам запрос
		потом мы генерим запрос для сервера
		мы получаем ответ от сервера
		кидаем юзеру данные от сервера
		
		*/
		$fp = fsockopen('s'.$host.'.example.com', 80, $errno, $errstr, 30);
		if (!$fp) {
			header ('HTTP/1.0 404 Not Found');
			header ('Location: /404.html');
			die();
		}else{
			$out='';
		    $out.="GET /u$folder/audio/$filename.mp3 HTTP/1.1\r\n";
			if (isset($_SERVER['HTTP_RANGE'])){
				$out.="Range: $_SERVER[HTTP_RANGE]\r\n";
				$out.="Accept-Ranges: bytes\r\n";
			}
		    $out.="Host: s$host.example.com\r\n";
		    $out.="User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5\r\n";
		    $out.="Accept: text/html,application/xhtml+xml,application/xml;q=0.9,* /*;q=0.8\r\n";
		    $out.="Accept-Language: ru,en-us;q=0.7,en;q=0.3\r\n";
//		    $out.="Accept-Encoding: gzip,deflate\r\n";
		    $out.="Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7\r\n";
		    $out.="Keep-Alive: 300\r\n";
		    $out.="Referer: [url]http://example.com/search.php?q=burzum%20dunkelheit&add=1&st=100\r\n[/url]";
		    $out.="Connection: Close\r\n\r\n";
		    fwrite($fp, $out);

			$hf=true;
			while(!feof($fp)){
			    $line=fgets($fp);
			    if($line=="\r\n"&&$hf){
			        $hf=false;
					header('Content-Disposition: attachment; filename="'.$att.'.mp3";');
			    }
			    if($hf)header($line);
			    	else echo $line;
			}
		    fclose($fp);
		    die();
		}
	}
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху