precio karma gopro drone php download performance

php - drone gopro karma precio



Limite la velocidad de descarga usando PHP (6)

Encontré en Google algunos scripts PHP para limitar la velocidad de descarga de un archivo, pero el archivo se descarga a 10 Mbps o si se descarga a 80 kbps cuando lo configuro, después de 5 mb, deja de descargarse.

¿Puede alguien decirme dónde puedo encontrar un buen script de límite de velocidad de descarga de PHP, por favor?

Muchas gracias

--- Editar ---

Aquí está el código:

<?php set_time_limit(0); // change this value below $cs_conn = mysql_connect(''localhost'', ''root'', ''''); mysql_select_db(''shareit'', $cs_conn); // local file that should be send to the client $local_file = $_GET[''file'']; // filename that the user gets as default $download_file = $_GET[''file'']; // set the download rate limit (=> 20,5 kb/s) $download_rate = 85; if(file_exists($local_file) && is_file($local_file)) { // send headers header(''Cache-control: private''); header(''Content-Type: application/octet-stream''); header(''Content-Length: ''.filesize($local_file)); header(''Content-Disposition: filename=''.$download_file); // flush content flush(); // open file stream $file = fopen($local_file, "r"); while(!feof($file)) { // send the current file part to the browser print fread($file, round($download_rate * 1024)); // flush the content to the browser flush(); // sleep one second sleep(1); } // close file stream fclose($file);} else { die(''Error: The file ''.$local_file.'' does not exist!''); } if ($dl) { } else { header(''HTTP/1.0 503 Service Unavailable''); die(''Abort, you reached your download limit for this file.''); } ?>


El motivo por el que la descarga se detiene después de 5 MB es porque tarda más de 60 segundos en descargar 5 MB a 80 KB / s. La mayoría de esos scripts de "limitador de velocidad" utilizan sleep() para pausar por un tiempo luego de enviar un fragmento, reanudar, enviar otro fragmento y pausar nuevamente. Pero PHP terminará automáticamente una secuencia de comandos si se ha estado ejecutando durante un minuto o más. Cuando eso sucede, la descarga se detiene.

Puede usar set_time_limit() para evitar que su secuencia de comandos finalice, pero algunos servidores web no le permitirán hacer esto. En ese caso, no tienes suerte.


Intenté con una clase personalizada que puede ayudarte a lidiar con las descargas que limitan las tasas. ¿Podrías probar lo siguiente?

class Downloader { private $file_path; private $downloadRate; private $file_pointer; private $error_message; private $_tickRate = 4; // Ticks per second. private $_oldMaxExecTime; // saving the old value. function __construct($file_to_download = null) { $this->_tickRate = 4; $this->downloadRate = 1024; // in Kb/s (default: 1Mb/s) $this->file_pointer = 0; // position of current download. $this->setFile($file_to_download); } public function setFile($file) { if (file_exists($file) && is_file($file)) $this->file_path = $file; else throw new Exception("Error finding file ({$this->file_path})."); } public function setRate($kbRate) { $this->downloadRate = $kbRate; } private function sendHeaders() { if (!headers_sent($filename, $linenum)) { header("Content-Type: application/octet-stream"); header("Content-Description: file transfer"); header(''Content-Disposition: attachment; filename="'' . $this->file_path . ''"''); header(''Content-Length: ''. $this->file_path); } else { throw new Exception("Headers have already been sent. File: {$filename} Line: {$linenum}"); } } public function download() { if (!$this->file_path) { throw new Exception("Error finding file ({$this->file_path})."); } flush(); $this->_oldMaxExecTime = ini_get(''max_execution_time''); ini_set(''max_execution_time'', 0); $file = fopen($this->file_path, "r"); while(!feof($file)) { print fread($file, ((($this->downloadRate*1024)*1024)/$this->_tickRate); flush(); usleep((1000/$this->_tickRate)); } fclose($file); ini_set(''max_execution_time'', $this->_oldMaxExecTime); return true; // file downloaded. } }

También he alojado el archivo como esencia en github aquí. - https://gist.github.com/3687527


La clase Downloader es buena pero tiene un problema si tiene dos descargas al mismo tiempo, perderá el valor de max_execution_time .

Un ejemplo:

Descargar el primer archivo (tamaño = 1 mb, tiempo de descarga de 100 segundos)

Después de un segundo segundo archivo de descarga (tamaño = 100 mb; tiempo de carga = 10000 segundos)

La primera descarga establece max_execution_time en 0

Segundo _oldMaxExecTime como 0

Primer extremo de descarga y devuelve max_execution_time a old value

Segundo final de descarga y devuelve max_execution time a 0



Un segundo es demasiado tiempo, hará que los clientes piensen que el servidor no responde y terminará prematuramente la descarga. Cambie el sleep(1) a usleep(200) :

set_time_limit(0); $file = array(); $file[''name''] = ''file.mp4''; $file[''size''] = filesize($file[''name'']); header(''Content-Type: application/octet-stream''); header(''Content-Description: file transfer''); header(''Content-Disposition: attachment; filename="'' . $file[''name''] . ''"''); header(''Content-Length: ''. $file[''size'']); $open = fopen($file[''name''], ''rb''); while( !feof($open) ){ echo fread($open, 256); usleep(200); } fclose($open);


En primer lugar, max_execution_time es el tiempo de ejecución de su script. Dormir no es parte de eso.

En cuanto a la limitación de velocidad, puede usar algo así como un cubo Token. Puse todo en una biblioteca conveniente para ti: bandwidth-throttle/bandwidth-throttle

use bandwidthThrottle/BandwidthThrottle; $in = fopen(__DIR__ . "/resources/video.mpg", "r"); $out = fopen("php://output", "w"); $throttle = new BandwidthThrottle(); $throttle->setRate(100, BandwidthThrottle::KIBIBYTES); // Set limit to 100KiB/s $throttle->throttle($out); stream_copy_to_stream($in, $out);