Здравствуйте! сегодня случилась беда на сайте, скрипт стал обрывать файлы после 24.09 мб В чем может быть проблема? PHP: <?php #usleep(2399999); session_start(); require "headers.php"; require "bdconn.php"; require 'cookie_auth.php'; require 'count.php'; $filesecret = '*****'; class download { var $properties = array( 'old_name' => '', 'new_name' => '', 'type' => '', 'size' => '', 'resume' => '', 'max_speed' => '' ); var $range = 0; function download($path, $name='', $type='application/force-download', $resume=0, $max_speed=1500) { $name = ($name == '') ? substr(strrchr("/".$path,"/"),1) : $name; $file_size = @filesize($path); #echo '<br>FROM FUNC '.$path; #echo '<br>SIZE: '.$file_size; exit(); #echo @fopen($path, "r"); $this->properties = array( 'old_name' => $path, 'new_name' => $name, 'type'=> $type, 'size' => $file_size, 'resume' => $resume, 'max_speed' => $max_speed ); if ($this->properties['resume']) { if(isset($_SERVER['HTTP_RANGE'])) { $this->range = $_SERVER['HTTP_RANGE']; $this->range = str_replace('bytes=', '', $this->range); $this->range = str_replace('-', '', $this->range); } else { $this->range = 0; } if ($this->range > $this->properties['size']) $this->range = 0; } else { $this->range = 0; } } function download_file() { if ($this->range) { header($_SERVER['SERVER_PROTOCOL'].' 206 Partial Content'); } else { header($_SERVER['SERVER_PROTOCOL'].' 200 OK'); } header('Pragma: public'); header('Expires: 0'); header('Cache-Control:'); header('Cache-Control: public'); header('Content-Description: File Transfer'); header('Content-Type: '.$this->properties["type"]); header('Content-Disposition: attachment; filename="'.$this->properties['new_name'].'";'); header('Content-Transfer-Encoding: binary'); if ($this->properties['resume']) header('Accept-Ranges: bytes'); if ($this->range) { header("Content-Range: bytes {$this->range}-".($this->properties['size']-1)."/".$this->properties['size']); header("Content-Length: ".($this->properties['size']-$this->range)); } else { header("Content-Length: ".$this->properties['size']); } @ini_set('max_execution_time', 0); @set_time_limit(); return $this->_download($this->properties['old_name'], $this->range); } function _download ($filename, $range=0) { @ob_end_clean(); if (($speed = $this->properties['max_speed']) > 0) $sleep_time = (8 / $speed) * 1e6; else $sleep_time = 0; $handle = fopen($filename, 'rb'); fseek($handle,$range); if ($handle === false) { return false; } //ob_flush(); while (!feof($handle)) { print (fread($handle, 1024*8)); flush(); usleep($sleep_time); } fclose($handle); return true; } } $name = trim($_GET['name']); if("ADMIN" == AdmCheck()) { #echo 'SELECT * FROM `file` WHERE `fullname` = "'.mysql_escape_string($name).'";'; $res = mysql_query('SELECT * FROM `file` WHERE `fullname` = "'.mysql_escape_string($name).'";') or die("Error".mysql_error()); } else { #echo 'SELECT * FROM `file` WHERE `fullname` = "'.mysql_escape_string($name).'";'; $res = mysql_query('SELECT * FROM `file` WHERE `fullname` = "'.mysql_escape_string($name).'" AND `avail` = "free";') or die("Error".mysql_error()); } if(mysql_num_rows($res) != 1) { echo '<span class = "error">Такого файла нет на сервере!</b>'.$name; echo '<br><a href="index.php">Index</a>'; exit(); } $res = mysql_fetch_row($res); $filenameHOME = 'http://95.79.30.48/uploads/'.md5(md5($name.$filesecret)); $filenameLOCAL = 'http://localhost/uploads/'.md5(md5($name.$filesecret)); $filenameJINO = 'http://forstud.info/uploads/'.md5(md5($name.$filesecret)); $curcount = $res[8] + 1; $res = mysql_query('UPDATE `file` SET `count` = "'.$curcount.'", `touchupload` = NOW() WHERE `fullname` = "'.mysql_escape_string($name).'" ;') or die("Error".mysql_error()); if( @fopen('http://forstud.info/uploads/'.md5(md5($name.$filesecret)), "r") && ($_SERVER["SERVER_NAME"] == 'www.forstud.info' || $_SERVER["SERVER_NAME"] == 'forstud.info')) { $a = new download('uploads/'.md5(md5($name.$filesecret)), $name, 'application/force-download', true); echo $a->download_file(); } else if( @fopen($filenameHOME, "r") ) { header('Location: ' . $filenameHOME); } else if( @fopen($filenameLOCAL, "r") ) { header('Location: ' . $filenameLOCAL); } else { DEBUG_f('ERROR: File not found on bouth hosts!'."\n".$name, TRUE); } ?>
Нет, единственное что заметил, переменная $_SERVER["SERVER_NAME"] изменилась, добавился префикс "www."
Old: Весьма неприятная ситуация -- написал провайдеру и увеличил скорость до максимума. New: Весьма неприятная ситуация -- написал в саппорт хостинга и увеличил скорость до максимума.
Провайдер ответил "Если отдача файла происходит скриптом, то отдача файла завершается через таймаут - 150 секунд." Какие варианты решения проблемы выможите предложить? Мне на ум приходит только переименовать файл и отправить его целиком через header.. но переименование и перемещение в другую дирректорию займёт время..
какой макс вес файлов на отдачу имеется? если < чем мег 30 то попробуй вместо цикла чтения/вывода файла прочитать его сразу, впихнуть в буфер и вытолкнуть юзеру через readfile(). правда не факт что поможет.
Вместо загрузки скриптом сделал так: PHP: if ( !copy( $this->properties['old_name'], 'uploads/tmp/'.$this->properties["new_name"])) { echo "Error while preparing"; exit(1); } header('Location: [url=http://forstud.info/uploads/tmp/'.$this-]http://forstud.info/uploads/tmp/'.$this-[/url]>properties['new_name']); Вопрос, когда очищать tmp?
зачем? так у тебя жесткая ссылка на файл. то же самое, если бы ты просто линк тыкнул в виде <a href="http://forstud.info/uploads/tmp/'.$this->properties['new_name']">. со скачивание еще тут понятно. только не понятно как файлы у тебя оказываются на сервере - 1 гб закинуть через банальную форму+http не выйдет. памяти не хватит.
Мне отдать файл надо с нормальным именем просто, поэтому и копирую.. Да можно при желании закинуть...ну не гиг конечно, до 400 ещё куда не шло..