2013-06-07 3 views
0

У меня есть все мои файлы, хранящиеся в базе данных mysql, как blobs. Я пытаюсь добавить ограничение скорости на скорость, с которой пользователь может загрузить их через наш сайт PHP. Я попытался использовать «sleep (1)»; метод, кажется, не работает, или я не делаю это правильно. Поэтому, если кто-то знает способ ограничить скорость, я буду рад вашей помощи.Ограничение скорости загрузки файла MySQL

Вот мой код скачать

 $query=mysql_query("SELECT * FROM file_servers WHERE id='$file_server_id'"); 
     $fetch=mysql_fetch_assoc($query); 
     $file_server_ip=$fetch['ip']; 
     $file_server_port=$fetch['port']; 
     $file_server_username=$fetch['username']; 
     $file_server_password=$fetch['password']; 
     $file_server_db=$fetch['database_name']; 
     $connectto=$file_server_ip.":".$file_server_port; 
     if (!$linkid = @mysql_connect($connectto, $file_server_username, $file_server_password, true)) 
     { 
      die("Unable to connect to storage server!"); 
     } 
     if (!mysql_select_db($file_server_db, $linkid)) 
     { 
      die("Unable to connect to storage database!"); 
     } 
     $nodelist = array(); 
     // Pull the list of file inodes 
     $SQL = "SELECT id FROM file_data WHERE file_id='$file_id' order by id"; 
     if (!$RES = mysql_query($SQL, $linkid)) 
     { 
      die("Failure to retrive list of file inodes"); 
     } 
     while ($CUR = mysql_fetch_object($RES)) 
     { 
      $nodelist[] = $CUR->id; 
     } 
     // Send down the header to the client 
     header("Content-Type: $data_type"); 
     header("Content-Length: $size"); 
     header("Content-Disposition: attachment; filename=$name"); 
     // Loop thru and stream the nodes 1 by 1 
     for ($Z = 0 ; $Z < count($nodelist) ; $Z++) 
     { 
      $SQL = "select file_data from file_data where id = " . $nodelist[$Z]; 
      if (!$RESX = mysql_query($SQL, $linkid)) 
      { 
       die("Failure to retrive file node data"); 
      } 
      $DataObj = mysql_fetch_object($RESX); 
      echo $DataObj->file_data; 
     } 
+1

Это * не * как вы дросселируете подключение к Интернету, а не то, для чего нужен движок БД. Я предлагаю прочитать правильную технологию для этого (и что это зависит от того, что вам нужно). – Madbreaks

+0

Во-первых, все функции 'mysql_' устарели. Вместо этого вы должны переключиться на «PDO» или «mysqli_». Во-вторых, вы должны использовать вещи для того, что они делают лучше всего. Файловые системы отлично подходят для хранения файлов и баз данных, которые отлично подходят для хранения данных. Вы могли бы сохранить имя файла, так что вы знаете, какой файл извлекать из файловой системы. – Arjan

ответ

0

Один из способов сделать это может быть сочетанием flush и сна:

  • прочитать часть того, что вы получите из базы данных
  • выхода некоторых байт
  • вровень выход пользователя
  • спать в течение 1 секунды

Но также возьмите добычу при дроссельной заслонке: http://php.net/manual/en/function.http-throttle.php У этого также есть пример. Я думаю, что это лучше подходит.

+0

Thx вы так много я пробовал спать с fluch ссылку, которую вы сказали использовать ob_flush, и это заставило его работать. :) – user2383089

0

это в самом последнем эхо линии в коде, где вы хотели бы реализовать throtling. Я не знаком с тем, поддерживает ли php выход на триплет.

если нет, то вы можете попытаться разделить этот контент ($DataObj->file_data), который вы хотите повторить, и эхо его маленький кусочек за маленький кусочек с небольшими паузами между

и обязательно отключить outbut буферизацию. в противном случае все, что вы эхо не выведете, пока весь скрипт не будет выполнен.

Смежные вопросы