2010-06-18 11 views
8

J'ai essayé de limiter la bande passante avec PHP. Je n'arrive pas à limiter le taux de téléchargement avec PHP.Limiter la bande passante de téléchargement avec cURL

Pouvez-vous s'il vous plaît aider ici?

function total_filesize($url) { 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, "$url"); 
    curl_setopt($ch, CURLINFO_SPEED_DOWNLOAD,12); //ITS NOT WORKING! 
    curl_setopt($ch, CURLOPT_USERAGENT, 
      "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.11) ". 
      "Gecko/20071127 Firefox/2.0.0.11"); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE); 
    curl_setopt($ch, CURLOPT_HEADER, false); 
    curl_setopt($ch, CURLOPT_NOBODY, true); 


    $chStore = curl_exec($ch); 
    $chError = curl_error($ch); 
    $chInfo = curl_getinfo($ch); 
    curl_close($ch); 
    return $size = $chInfo['download_content_length']; 
} 

function __define_url($url) { 
    $basename = basename($url); 
    Define('filename',$basename); 
    $define_file_size = total_filesize($url); 
    Define('filesizes',$define_file_size); 
} 

function _download_file($url_file) { 
    __define_url($url_file); 

    // $range = "50000-60000"; 
    $filesize = filesizes; 
    $file = filename; 
    header('Content-Type: application/octet-stream'); 
    header('Content-Disposition: attachment; filename="'.$file.'"'); 
    header('Content-Transfer-Encoding: binary'); 
    header("Content-Length: $filesize"); 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL,"$url_file"); 
    curl_setopt($ch, CURLOPT_BINARYTRANSFER,1); 
    // curl_setopt($ch, CURLOPT_RANGE,$range); 

    curl_exec($ch); 
    curl_close($ch); 
} 
_download_file('http://rarlabs.com/rar/wrar393.exe'); 

Répondre

15

CURLOPT_MAX_RECV_SPEED_LARGE est l'option que vous voulez.

Ajouté dans la boucle 7.15.5. Présent en PHP/CURL depuis PHP 5.4.0

+0

http://bugs.php.net/bug.php?id=51815 Il a été ajouté récemment et n'est présent dans aucune version de production. Mais toujours une réponse correcte, merci. –

0

Je limiter la largeur de bande par l'intermédiaire du serveur, par exemple IIS ou Apache.

+0

Si j'avais besoin de le faire, je le ferais sur le système d'exploitation ou le réseau - mais au nom de Dieu ... pourquoi? Je suis d'accord que c'est logique pour les tests, mais en production la bande passante ralentit ** votre ** serveur ainsi que le client. – symcbean

0

CURLINFO_SPEED_DOWNLOADinforme vous de la vitesse de téléchargement; ce n'est pas une option que vous pouvez définir. Cela dit, si c'était une option, vous la placeriez au mauvais endroit (dans la partie où vous faites une requête HEAD pour obtenir la taille du fichier, - ce qui d'ailleurs n'est pas nécessaire, mais cela n'a pas d'importance ici - et pas où vous téléchargez réellement le fichier).

Vous pouvez le faire avec des flux PHP, où vous bouclez et soit récupérer/envoyer plus de données ou attendre selon votre limite, mais je ne pense pas qu'il existe un moyen d'échanger une ressource curl pour un flux PHP. Votre seule alternative peut être l'utilisation du http wrapper à la place.

Vous pouvez également essayer CURLOPT_FILE et enregistrez le fichier dans un flux "php: // temp", puis lisez-le, mais je ne suis pas sûr que cela fonctionnerait.

Questions connexes