Форум русскоязычного сообщества Ubuntu


Автор Тема: [РЕШЕНО]на сколько хватит памяти PHP если файлики по 1гб качает много народа?  (Прочитано 1194 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн dj--alex

  • Автор темы
  • Старожил
  • *
  • Сообщений: 3209
  • Понимаешь, я какбы беру в руки лопату и говорю...
    • Просмотр профиля
    • все мои творения и занятия
LAMP: не заливаются и не скачиваются файлы более 500 мб

Что надо настроить чтобы отдавались и принимались большие файлы вне зависимости от соединения???

если у меня быстрый канал - более 10000кб\с  я могу качать большие файлы до 2гб спокойно
если у меня канал 128кб\с  какого то хрена файлы более 200мб не качаются (!!!)
мне шире канал не сделают,надо както сделать так чтобы и другим у кого канал тоже узкий можно было сделать так чтобы сервис работал
просто скачивается 2кб и в них html фигня
по ftp же все передается, или по http, но напрямую на файл -тоже передается.

apache i php .conf   всё перерыл - всё верно - ошибок нет ! но не работает!

; Maximum allowed size for uploaded files.
upload_max_filesize = 2000M

post = 2000M


180мб-  будет качаться    http://195.88.240.252/dbs4/filemgr.php?c=9637af4d1479f86e06cfd38fd61cdcd0
это основная причина почему я у себя не держу больших файлов.

а вот этот - хрен скачается.
http://195.88.240.252/dbs4/filemgr.php?c=82ad20cdec64e6276784d5484835a439


причем старая версия программы dbscript 3 даёт скачать такие файлы
а новая - dbscript 4.1.5. нет (!)  почему - хрен знает

разобрался... дело в том сколько памяти разрешено юзать PHP -
Объем памяти PHP для критических операций поставил 2гигабайта.

А что если одновременно несколько человек будут качать по файлику

насколько хватит памяти и файла подкачки ?

как ПХП вообще файл в принципе отдает?
« Последнее редактирование: 05 Май 2010, 15:50:35 от dj--alex »
Ubuntu 16.04.1 MATE x64, 18.1 x64 Mate, MX-Linux 16 Mate Mate Mate Mate. PC:?\FX4100@4ghz\8Gb\2TB HDD\1060gtx\90GB Ocz
https://forum.ubuntu.ru/index.php?topic=199897.0

Оффлайн Mam(O)n

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5855
    • Просмотр профиля
как ПХП вообще файл в принципе отдает?
Всё зависит от криворукости программера, написавшего скрипт.

Оффлайн dj--alex

  • Автор темы
  • Старожил
  • *
  • Сообщений: 3209
  • Понимаешь, я какбы беру в руки лопату и говорю...
    • Просмотр профиля
    • все мои творения и занятия
скрипт походу загружает целиком файл в оперативную память и только после этого начинает отдавать
память освобождается по отдаче файла

вопрос- это кэш память, или она загружается реально и её другие приложения не смогут использовать?

а мне надо чтобы он его загружал ну не более чем по 50мб на файл....он же может постепенно читать с харда?
использую стандартную функцию для отдачи файла
можете почитать filemgr.php
а также dbscore

3-я версия.
ttp://eternity.chg.su/dbs/filemgr.php?c=9b848fa952e76e70ce7ddf9a1c9e7593
Ubuntu 16.04.1 MATE x64, 18.1 x64 Mate, MX-Linux 16 Mate Mate Mate Mate. PC:?\FX4100@4ghz\8Gb\2TB HDD\1060gtx\90GB Ocz
https://forum.ubuntu.ru/index.php?topic=199897.0

Оффлайн Mam(O)n

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5855
    • Просмотр профиля
Не, если в память читает, то это не в кеш, на каждый скрипт отдельно выделяется память. А скрипт почитал, там вызывается функция sendfile, которая скорее всего находится в зазенденном и обфусцированном filemgr.php, исходники которого я не могу прочитать (дезендить впадлу).

Оффлайн AnrDaemon

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 25940
    • Просмотр профиля
Дядя, специально для тебя пишу русскими буквами: HTTP POST не предназначен для заливки таких объёмов на сервер...
Найди нормальные способы (ftp тот же).
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…

Оффлайн dj--alex

  • Автор темы
  • Старожил
  • *
  • Сообщений: 3209
  • Понимаешь, я какбы беру в руки лопату и говорю...
    • Просмотр профиля
    • все мои творения и занятия
ну на яндексе же заливают по гигабайту,  и через что они заливают спрашивается?
и не только они.
надо срочно им написать..какого фига они принимают без проблем файлы по 1.6гб  не должно так работать
пусть ftp для каждого открывают. епрст.. не срочно челобитную подам )))


filemgr не зазенденный, а как раз очень открытый и как и почти все кроме одного другие файлы более года.

по нормальному сказать нужен код нельзя?  
вообще код щтука подозрительная..иногда бывает побольше мата в комментах напишешь и код даже работать начинает.
вот функция sendfile - она вообще практически стандартна в отличие от аплода.
http://wow.chg.su/inside/filemgr.php?c=4abc51bd5e9fe0fabbc7fc0a122e4ae4
« Последнее редактирование: 16 Март 2010, 13:05:37 от dj--alex »
Ubuntu 16.04.1 MATE x64, 18.1 x64 Mate, MX-Linux 16 Mate Mate Mate Mate. PC:?\FX4100@4ghz\8Gb\2TB HDD\1060gtx\90GB Ocz
https://forum.ubuntu.ru/index.php?topic=199897.0

Оффлайн Mam(O)n

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5855
    • Просмотр профиля
filemgr не зазенденный, а как раз очень открытый и как и почти все кроме одного другие файлы более года.
по нормальному сказать нужен код нельзя? 
По нормальному нельзя ли сразу было код выложить? Тот, что мне попался в интернете - зазенденный.

Пользователь решил продолжить мысль 16 Март 2010, 13:11:12:
Я имел ввиду dbscore.lib
« Последнее редактирование: 16 Март 2010, 13:11:12 от Mam(O)n »

Оффлайн dj--alex

  • Автор темы
  • Старожил
  • *
  • Сообщений: 3209
  • Понимаешь, я какбы беру в руки лопату и говорю...
    • Просмотр профиля
    • все мои творения и занятия
в код вплетена система активации для нашей компании
она хоть и не используется вообще на линуксе, но каждый раз для каждого релиза выдирать её для открытия исходников (что пользы кстати не принесло, никто так и не добавился в проект) - лично меня задолбало. а выкладывать в месте с ней мне не позволительно.
я даже думал автоматический выдиратель к программе собрать но лень :))

если функции мало ,и надо полный можно взять эту версию
http://db-script.googlecode.com/files/dbscript_3.6.12_by_dj--alex_open_source_%28MANGOS.RU%29.rar

проблема одна и та же остаётся.

ну я и выложил конкретно нужную функцию..я не понимаю правда как в 10 строках нельза вставить что то вроде поблочной отдачи файла..
должен же быт такой механизм..
а то скачаешь 5 файлов по 5гб ... и все сервер навернулся..и 50гигов свопа не спасут.


« Последнее редактирование: 16 Март 2010, 18:18:17 от dj--alex »
Ubuntu 16.04.1 MATE x64, 18.1 x64 Mate, MX-Linux 16 Mate Mate Mate Mate. PC:?\FX4100@4ghz\8Gb\2TB HDD\1060gtx\90GB Ocz
https://forum.ubuntu.ru/index.php?topic=199897.0

Оффлайн Mam(O)n

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5855
    • Просмотр профиля
В функции используется стандартный readfile, с ним проблем не должно было быть, если только PHP не 4-ой ветки. Говорили, что там есть утечки в самом PHP... Если брать в расчёт скрипт, то точное потребление памяти наверное можно только профайлером замерить. НО! Проблема наверное еще может быть еще в связке frontend<->backend. Через чего от PHP до юзера передаётся информация? Каким образом всё это соединиено? Что показывает top по потреблению памяти, какой процесс прожорлив?

Оффлайн dj--alex

  • Автор темы
  • Старожил
  • *
  • Сообщений: 3209
  • Понимаешь, я какбы беру в руки лопату и говорю...
    • Просмотр профиля
    • все мои творения и занятия
В функции используется стандартный readfile, с ним проблем не должно было быть, если только PHP не 4-ой ветки. Говорили, что там есть утечки в самом PHP... Если брать в расчёт скрипт, то точное потребление памяти наверное можно только профайлером замерить. НО! Проблема наверное еще может быть еще в связке frontend<->backend. Через чего от PHP до юзера передаётся информация? Каким образом всё это соединиено? Что показывает top по потреблению памяти, какой процесс прожорлив?
php 5.2

все выполняет по сути filemgr.php  dbscore только настройки\права и т.п.загружает и функции содержит
в одном из следущих релизов библиотеки от него отсоединю чтобы не выкладывать постоянно.

 я по диспетчеру меряю , а не топом.
в спокойном состоянии 1.2 гб занято из 4..  1 файл качаю, - уже 1.9 гб занято ( ровно по ёмкости файла растет)
2 файла - одинаковых  2.6 гб
интересно что будет если я его начну качать сразу 50 раз. догадается  система что это один и тот же файл
или будет насиловать комп сколько сможет?
топ тоже самое даёт..блин еле удалось скопировать. :)
Swap: 12538692k total,    93140k used, 12445552k free,  1813004k cached
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                               
 1299 www-data  20   0 1791m 1.1g 545m R   57 27.7   0:01.98 apache2                               
23022 al        20   0  153m  94m  10m S   10  2.4  25:29.76 nxagent                               
21129 al        20   0  221m  20m  15m S    7  0.5   0:02.05 gnome-system-mo                       
14085 al        20   0 71884  19m  10m S    1  0.5  15:33.09 npview
Ubuntu 16.04.1 MATE x64, 18.1 x64 Mate, MX-Linux 16 Mate Mate Mate Mate. PC:?\FX4100@4ghz\8Gb\2TB HDD\1060gtx\90GB Ocz
https://forum.ubuntu.ru/index.php?topic=199897.0

Оффлайн dj--alex

  • Автор темы
  • Старожил
  • *
  • Сообщений: 3209
  • Понимаешь, я какбы беру в руки лопату и говорю...
    • Просмотр профиля
    • все мои творения и занятия
заменил readfile вот этим классом.

теперь программа отлично работает!

Dbscript 4.1.8
http://wow.chg.su/dbs/filemgr.php?c=153de560304bd5e5bb1281f828da12dd

класс вызываю так
       $object = New download ($file,$name=$filename, $resume=1, $max_speed=$setspeedlimit);//запрет докачки - зло.
       $object->download_file ();

вот может кому пригодится.

class download{

      var $properties = array(    'old_name' => "",
                                  'new_name' => "",
                                  'type' => "",
                                  'size' => "",
                                  'resume' => "",
                                  'max_speed' => ""
                                  );

      var $range = 0;

      function download($path, $name="", $resume=0, $max_speed=0){
   //echo "$path, $name=, $resume=0, $max_speed=0";exit;
         $name = ($name == "") ? substr(strrchr("/".$path,"/"),1) : $name;

          $file_size = @filesize($path);

          $this->properties =  array(
                                      'old_name' => $path,
                                      'new_name' => $name,
                                      'type'=> "application/force-download",
                                      '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();
              $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;
          }

          while (!feof($handle))
          {
              print (fread($handle, 1024*8));
              ob_flush();
              flush();
              usleep($sleep_time);
        }

        fclose($handle);

        return true;
     }

   }
Ubuntu 16.04.1 MATE x64, 18.1 x64 Mate, MX-Linux 16 Mate Mate Mate Mate. PC:?\FX4100@4ghz\8Gb\2TB HDD\1060gtx\90GB Ocz
https://forum.ubuntu.ru/index.php?topic=199897.0

 

Страница сгенерирована за 0.062 секунд. Запросов: 22.