За последние 24 часа нас посетили 34758 программистов и 1688 роботов. Сейчас ищут 760 программистов ...

Сломался скрипт помогите надо быстрее понять в чём тут дело.

Тема в разделе "Прочие вопросы по PHP", создана пользователем unmanner, 23 май 2011.

  1. unmanner

    unmanner Активный пользователь

    С нами с:
    23 янв 2011
    Сообщения:
    105
    Симпатии:
    0
    Здравствуйте! сегодня случилась беда на сайте, скрипт стал обрывать файлы после 24.09 мб

    В чем может быть проблема?

    PHP:
    1.  
    2. <?php
    3. #usleep(2399999);
    4. require "headers.php";
    5. require "bdconn.php";
    6. require 'cookie_auth.php';
    7. require 'count.php';
    8. $filesecret = '*****';
    9.  
    10. class download {
    11.  
    12.   var $properties = array(
    13.           'old_name' => '',
    14.           'new_name' => '',
    15.           'type' => '',
    16.           'size' => '',
    17.           'resume' => '',
    18.           'max_speed' => ''
    19.   );
    20.  
    21.   var $range = 0;
    22.  
    23.   function download($path, $name='', $type='application/force-download', $resume=0, $max_speed=1500) {
    24.  
    25.     $name = ($name == '') ? substr(strrchr("/".$path,"/"),1) : $name;
    26.  
    27.     $file_size = @filesize($path);
    28.  
    29. #echo '<br>FROM FUNC '.$path;
    30. #echo '<br>SIZE: '.$file_size; exit();
    31. #echo @fopen($path, "r");
    32.  
    33.     $this->properties =  array(
    34.             'old_name' => $path,
    35.             'new_name' => $name,
    36.             'type'=> $type,
    37.             'size' => $file_size,
    38.             'resume' => $resume,
    39.             'max_speed' => $max_speed
    40.     );
    41.  
    42.     if ($this->properties['resume']) {
    43.  
    44.       if(isset($_SERVER['HTTP_RANGE'])) {
    45.  
    46.         $this->range = $_SERVER['HTTP_RANGE'];
    47.         $this->range = str_replace('bytes=', '', $this->range);
    48.         $this->range = str_replace('-', '', $this->range);
    49.  
    50.       } else {
    51.  
    52.         $this->range = 0;
    53.  
    54.       }
    55.  
    56.       if ($this->range > $this->properties['size']) $this->range = 0;
    57.  
    58.     } else {
    59.  
    60.       $this->range = 0;
    61.  
    62.     }
    63.  
    64.   }
    65.  
    66.  
    67.   function download_file() {
    68.  
    69.     if ($this->range) {
    70.       header($_SERVER['SERVER_PROTOCOL'].' 206 Partial Content');
    71.     } else {
    72.       header($_SERVER['SERVER_PROTOCOL'].' 200 OK');
    73.     }
    74.     header('Pragma: public');
    75.     header('Expires: 0');
    76.     header('Cache-Control:');
    77.     header('Cache-Control: public');
    78.     header('Content-Description: File Transfer');
    79.     header('Content-Type: '.$this->properties["type"]);
    80.     header('Content-Disposition: attachment; filename="'.$this->properties['new_name'].'";');
    81.     header('Content-Transfer-Encoding: binary');
    82.  
    83.     if ($this->properties['resume']) header('Accept-Ranges: bytes');
    84.  
    85.     if ($this->range) {
    86.  
    87.       header("Content-Range: bytes {$this->range}-".($this->properties['size']-1)."/".$this->properties['size']);
    88.       header("Content-Length: ".($this->properties['size']-$this->range));
    89.  
    90.  
    91.     } else {
    92.  
    93.       header("Content-Length: ".$this->properties['size']);
    94.  
    95.     }
    96.  
    97.     @ini_set('max_execution_time', 0);
    98.     @set_time_limit();
    99.     return $this->_download($this->properties['old_name'], $this->range);
    100.   }
    101.  
    102.   function _download ($filename, $range=0) {
    103.     @ob_end_clean();
    104.  
    105.     if (($speed = $this->properties['max_speed']) > 0)
    106.       $sleep_time = (8 / $speed) * 1e6;
    107.     else
    108.       $sleep_time = 0;
    109.  
    110.     $handle = fopen($filename, 'rb');
    111.     fseek($handle,$range);
    112.  
    113.     if ($handle === false) {
    114.       return false;
    115.     }
    116.     //ob_flush();
    117.     while (!feof($handle)) {
    118.       print (fread($handle, 1024*8));
    119.       flush();
    120.       usleep($sleep_time);
    121.     }
    122.     fclose($handle);
    123.     return true;
    124.   }
    125. }
    126.  
    127.  
    128. $name = trim($_GET['name']);
    129.  
    130. if("ADMIN" == AdmCheck())
    131.     {
    132.     #echo 'SELECT * FROM `file` WHERE `fullname` = "'.mysql_escape_string($name).'";';
    133.     $res = mysql_query('SELECT * FROM `file` WHERE `fullname` = "'.mysql_escape_string($name).'";')  
    134.               or die("Error".mysql_error());
    135.     }
    136. else
    137.     {  
    138.     #echo 'SELECT * FROM `file` WHERE `fullname` = "'.mysql_escape_string($name).'";';
    139.     $res = mysql_query('SELECT * FROM `file` WHERE `fullname` = "'.mysql_escape_string($name).'" AND `avail` = "free";')  
    140.                   or die("Error".mysql_error());
    141.     }
    142.  
    143. if(mysql_num_rows($res) != 1)
    144.     {
    145.     echo '<span class = "error">Такого файла нет на сервере!</b>'.$name;
    146.     echo '<br><a href="index.php">Index</a>';
    147.     exit();
    148.     }
    149.  
    150.     $res = mysql_fetch_row($res);
    151.  
    152.     $filenameHOME  = 'http://95.79.30.48/uploads/'.md5(md5($name.$filesecret));
    153.     $filenameLOCAL = 'http://localhost/uploads/'.md5(md5($name.$filesecret));
    154.     $filenameJINO  = 'http://forstud.info/uploads/'.md5(md5($name.$filesecret));
    155.  
    156.     $curcount = $res[8] + 1;
    157.     $res = mysql_query('UPDATE `file` SET `count` = "'.$curcount.'", `touchupload` = NOW() WHERE `fullname` = "'.mysql_escape_string($name).'" ;')
    158.     or die("Error".mysql_error());
    159.  
    160. if( @fopen('http://forstud.info/uploads/'.md5(md5($name.$filesecret)), "r") && ($_SERVER["SERVER_NAME"] == 'www.forstud.info' || $_SERVER["SERVER_NAME"] == 'forstud.info'))
    161.     {
    162.         $a = new download('uploads/'.md5(md5($name.$filesecret)), $name, 'application/force-download', true);
    163.         echo $a->download_file();
    164.     }
    165.  
    166. else if( @fopen($filenameHOME, "r") )
    167.     {
    168.     header('Location: ' . $filenameHOME);
    169.     }
    170.  
    171. else if( @fopen($filenameLOCAL, "r") )
    172.     {
    173.     header('Location: ' . $filenameLOCAL);
    174.     }
    175. else
    176.     {
    177.     DEBUG_f('ERROR: File not found on bouth hosts!'."\n".$name, TRUE);
    178.     }
    179. ?>
    180.  
     
  2. Benjamin

    Benjamin Активный пользователь

    С нами с:
    23 янв 2009
    Сообщения:
    154
    Симпатии:
    0
    Адрес:
    Тула
    А раньше обрывал?
     
  3. unmanner

    unmanner Активный пользователь

    С нами с:
    23 янв 2011
    Сообщения:
    105
    Симпатии:
    0
    Да, раньше было всё отлично.... вообще не понимаю в чём может быть тут дело..
     
  4. unmanner

    unmanner Активный пользователь

    С нами с:
    23 янв 2011
    Сообщения:
    105
    Симпатии:
    0
    igordata Help me :)
     
  5. Benjamin

    Benjamin Активный пользователь

    С нами с:
    23 янв 2009
    Сообщения:
    154
    Симпатии:
    0
    Адрес:
    Тула
    Настройки веб-сервера не меняли?
     
  6. unmanner

    unmanner Активный пользователь

    С нами с:
    23 янв 2011
    Сообщения:
    105
    Симпатии:
    0
    Нет, единственное что заметил, переменная $_SERVER["SERVER_NAME"] изменилась, добавился префикс "www."
     
  7. unmanner

    unmanner Активный пользователь

    С нами с:
    23 янв 2011
    Сообщения:
    105
    Симпатии:
    0
    Увеличил скорость -- загрузилось больше, значит дело в каком-то таймере! Только в каком??
     
  8. unmanner

    unmanner Активный пользователь

    С нами с:
    23 янв 2011
    Сообщения:
    105
    Симпатии:
    0
    Old:
    Весьма неприятная ситуация -- написал провайдеру и увеличил скорость до максимума.

    New:
    Весьма неприятная ситуация -- написал в саппорт хостинга и увеличил скорость до максимума.
     
  9. unmanner

    unmanner Активный пользователь

    С нами с:
    23 янв 2011
    Сообщения:
    105
    Симпатии:
    0
    Провайдер ответил "Если отдача файла происходит скриптом, то отдача файла завершается через таймаут - 150 секунд."

    Какие варианты решения проблемы выможите предложить? Мне на ум приходит только переименовать файл и отправить его целиком через header.. но переименование и перемещение в другую дирректорию займёт время..
     
  10. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    какой макс вес файлов на отдачу имеется? если < чем мег 30 то попробуй вместо цикла чтения/вывода файла прочитать его сразу, впихнуть в буфер и вытолкнуть юзеру через readfile(). правда не факт что поможет.
     
  11. unmanner

    unmanner Активный пользователь

    С нами с:
    23 янв 2011
    Сообщения:
    105
    Симпатии:
    0
    До 200 мб сейчас уже есть ия планирую что будут и до ГБ файлики..
     
  12. unmanner

    unmanner Активный пользователь

    С нами с:
    23 янв 2011
    Сообщения:
    105
    Симпатии:
    0
    Вместо загрузки скриптом сделал так:

    PHP:
    1.  
    2. if ( !copy( $this->properties['old_name'], 'uploads/tmp/'.$this->properties["new_name"]))
    3. {
    4. echo "Error while preparing";  exit(1);
    5. }
    6.  
    7.     header('Location: [url=http://forstud.info/uploads/tmp/'.$this-]http://forstud.info/uploads/tmp/'.$this-[/url]>properties['new_name']);
    8.  
    Вопрос, когда очищать tmp?
     
  13. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    зачем? так у тебя жесткая ссылка на файл. то же самое, если бы ты просто линк тыкнул в виде <a href="http://forstud.info/uploads/tmp/'.$this->properties['new_name']">.

    со скачивание еще тут понятно. только не понятно как файлы у тебя оказываются на сервере - 1 гб закинуть через банальную форму+http не выйдет. памяти не хватит.
     
  14. unmanner

    unmanner Активный пользователь

    С нами с:
    23 янв 2011
    Сообщения:
    105
    Симпатии:
    0
    Мне отдать файл надо с нормальным именем просто, поэтому и копирую..

    Да можно при желании закинуть...ну не гиг конечно, до 400 ещё куда не шло..