kanaris
Новичок
Как обойти таймаут при отдаче файла?
Добрый вечер, всех с праздником.
Хостер ставит ограничение по времени на выполнение php-скриптов - 30 сек, обойти его set_time_limit или через .htaccess нельзя. Скрипт качает файло с одного сервера, и на ходу (т.е. без промежуточного сохранения на сервере) отдает его клиенту. Используются сокеты, поддержка докачки предусмотрена. Поскольку файлы большие, за 30 секунд они не успевают перекачаться и обрывается работа скрипта.
Подскажите пожалуйста, как можно отдавать файл частями? Чтобы когда закончился таймаут, клиент снова послал запрос на скачивание с оборванного места?
Вот кусок скрипта:
Добрый вечер, всех с праздником.
Хостер ставит ограничение по времени на выполнение 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();
}
}
