PHP Speed Limit

Signaler
Messages postés
470
Date d'inscription
vendredi 14 novembre 2003
Statut
Membre
Dernière intervention
23 octobre 2007
-
Messages postés
470
Date d'inscription
vendredi 14 novembre 2003
Statut
Membre
Dernière intervention
23 octobre 2007
-
bonjour à tous

je désire créer un script qui limite la vitesse de téléchargement.
N'ayant pas acces auw commandes sleep

j'ai coder ce code mais il ne fonctionne pas très bien.....
Il a tendance à bugger en cours de download

pouvez vous m'aider svp

un grand merci

Filipe

Le code:
function f_telechargement($dossier,$fichier,$taille) {
/* definition des entetes */
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Cache-control: private",false);
header("Pragma: no-cache");
header("Content-Length: " . $taille);
header("Content-Type: application/force-download");
header("Content-Type: application/download",false);
header("Content-Type: application/octetstream",false);
header("Content-Type: application/octet-stream",false);
header("Content-Disposition: attachment; filename="".$fichier.""");
header("Content-transfer-encoding: binary");
header("connection: keep-alive");

$fp = fopen("$dossier/$fichier", 'rb');
$file_size = filesize ($dossier/$fichier);
$buff = file_get_contents($dossier/$fichier, 1);
$buffer = 1;
flush();
list($usec, $sec) = explode(" ",microtime());
$last_sec = $sec-5;
$speed=100000;
$limitspeed=1;
if ($limitspeed==1) {
while (!$buffer==$file_size) {
if ($last_sec==$sec) { //on a déja donné cette seconde....
} else {
$out = substr($buff, $buffer, $speed); //
print($out);
$buffer=$buffer+$speed;
$last_sec++;
}
flush();
} //end while
fclose ($fp); }
}

20 réponses

Messages postés
470
Date d'inscription
vendredi 14 novembre 2003
Statut
Membre
Dernière intervention
23 octobre 2007
1
oups ^^ ca c'est une autre version qui marche pas....

voici le bon qui marche

header inchangés

$fp = fopen("$dossier/$fichier", 'rb');
flush();
list($usec, $sec) = explode(" ",microtime());
$last_sec = $sec-5;
$speed=100000;
$limitspeed=1;
if ($limitspeed==1) {
while (!feof($fp)) {
if ($last_sec==$sec) {
} else {
print(fread($fp, $speed));
$last_sec++;
}
flush();
} //end while
fclose ($fp);
Messages postés
9433
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
8
Salut,



tu dois surement dépasser le max_execution_time de php.



il faut changer cette valeur dans le php.ini ou via la fonction set_time_limit() si tu es en dédié.

<hr size="2" width="100%"><li>Entraide, dépannage et vulgarisation informatique : Mon site de vulgarisation informatique</li>
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
39
salut



t'as usleep



ou t'as aussi la possibilitée de faire une boucle for, mais la, tu vas faire bosser ton hébergeur pour rien...

In a dream, I saw me, drop dead... U was here, U cried... It was just a deam, if I die, U won't cry, maybe, U'll be happy

http://coucou747.hopto.org
Messages postés
9433
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
8
ça n'empêchera toutefois pas de passer le max_execution_time

<hr size="2" width="100%"><li>Entraide, dépannage et vulgarisation informatique : Mon site de vulgarisation informatique</li>
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
39
j'ai jamais dit le contraire, t'as tout à fait raison, sans ça, les trop gros téléchargements seront bloqués...

In a dream, I saw me, drop dead... U was here, U cried... It was just a deam, if I die, U won't cry, maybe, U'll be happy

http://coucou747.hopto.org
Messages postés
470
Date d'inscription
vendredi 14 novembre 2003
Statut
Membre
Dernière intervention
23 octobre 2007
1
Merci pour vos réponses

set_time_limt(0); // ca ne marche pas :(

mais lorsque je remplacer tous mon code (sauf header) par
@readfile("$dossier/$fichier")
cela marche très bien même avec des gros fichier 15mo

les fonctions sleep sont bloquées

qu'apporterait l'utilisation d'une boucle For...

merci de siuvre mon sujet :-)

Filipe
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
39
for ferais patienter ton script à la manière de sleep, on appelle ça
boucle de ralentissement, c'est une solution efficace pour les jeux
vidéos, mais pour les pages web, c'est dégeu ! C'est pour ça que sleep
a été créé, mais bon, si cette fonction est désactivée, alors c'est
mort...

In a dream, I saw me, drop dead... U was here, U cried... It was just a deam, if I die, U won't cry, maybe, U'll be happy

http://coucou747.hopto.org
Messages postés
470
Date d'inscription
vendredi 14 novembre 2003
Statut
Membre
Dernière intervention
23 octobre 2007
1
dégue mais ca marcherai ?? :)
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
39
essai toujours !!!!



(d'après toi, je te le dirais ou non si ça marcherais ???)

In a dream, I saw me, drop dead... U was here, U cried... It was just a deam, if I die, U won't cry, maybe, U'll be happy

http://coucou747.hopto.org
Messages postés
470
Date d'inscription
vendredi 14 novembre 2003
Statut
Membre
Dernière intervention
23 octobre 2007
1
ca ne marche pas :(


$fp = fopen("$dossier/$fichier", 'rb');
flush();
list($usec, $sec) = explode(" ",microtime());
$last_sec = $sec-5;
$speed=100000;
set_time_limit(0);
$limitspeed=1;
if ($limitspeed==1) {
for (;;) {
if ($last_sec==$sec) { //ba rien tattend c'est tout
} else {
if (ftell($fp)==$taille) {break;}
print(fread($fp, $speed));
$last_sec++;
}
flush();
} //end boucle
fclose ($fp); } // dl limiter


une idée ?

merci

Filipe
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
39
$a=0;

$fp = fopen("$dossier/$fichier", 'rb');

set_time_limit(0);

while (!feof($fp)){

$f=fgets($fp, 256);

for ($i=0;$i<1000;$i++) {$a++}

echo $f;

}

fclose ($fp); } // dl limiter


In a dream, I saw me, drop dead... U was here, U cried... It was just a deam, if I die, U won't cry, maybe, U'll be happy

http://coucou747.hopto.org
Messages postés
470
Date d'inscription
vendredi 14 novembre 2003
Statut
Membre
Dernière intervention
23 octobre 2007
1
ok merci ca fonctionne, m^me si on peut pas vraiment régler la vitesse mais je vai me pencher dessus,

sur cette ligne for ($i=0;$i<1000;$i++) {$a++} // oublis pas le ;

merci je verrai ca demain

Filipe
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
39
fais réponse accèptée stp

In a dream, I saw me, drop dead... U was here, U cried... It was just a deam, if I die, U won't cry, maybe, U'll be happy

http://coucou747.hopto.org
Messages postés
470
Date d'inscription
vendredi 14 novembre 2003
Statut
Membre
Dernière intervention
23 octobre 2007
1
non marches pas :--(

le code
list($usec, $sec) = explode(" ",microtime());
$last_sec = $sec-5;
$a=0;
$fp = fopen("$dossier/$fichier", 'rb');
set_time_limit(0);
while (!feof($fp)){
$f=fread($fp, 20000);

// on attend la prochaine seconde
for (;;) {
if ($sec>$last_sec) {break;}
list($usec, $sec) = explode(" ",microtime());
}
print $f;
$last_sec++;
}

pas de soucis je ferrai réponse accéptée dès que je serrai sur la voie :D

merci de ton aide

sa bloque en plein download....

Filipe
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
39
$a=0;

$fp = fopen("$dossier/$fichier", 'rb');

set_time_limit(0);

while (!feof($fp)){

$f=fgets($fp, 256);



list($usec, $lastsec) = explode(' ',microtime());

for (;$sec>$last_sec;) {

list($usec, $sec) = explode(' ',microtime());

}

echo $f;

}

fclose ($fp); } // dl limiter


In a dream, I saw me, drop dead... U was here, U cried... It was just a deam, if I die, U won't cry, maybe, U'll be happy

http://coucou747.hopto.org
Messages postés
470
Date d'inscription
vendredi 14 novembre 2003
Statut
Membre
Dernière intervention
23 octobre 2007
1
merci de te donner tant de mal pour mon problème

le code que tu as donné marche mais il n'y a pas vraiment de "limite"
(ou vraiment j'ai rien vu )

le code
list($usec, $sec) = explode(' ',microtime());
$last_sec = $sec-5; // seconde à laquelle démarre le DL

$a=0;
$fp = fopen("$dossier/$fichier", 'rb');
set_time_limit(0);
while (!feof($fp)){
$f=fgets($fp, 256);

// attente de 1 sec
for (;$sec>$last_sec;) {
list($usec, $sec) = explode(' ',microtime());
}

$last_sec++;
// pour que cette ligne (;$sec>$last_sec;) est un "sens"
// sinon last_time sera toujours inf à sec
echo $f;
}
fclose ($fp);

ca plante tjs, je voi vraiment pas d'ou cela peut venir... as t une idée ?

merci de ton aide

Filipe
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
39
oui j'ai une idée : tu t'emmèlles les pincaux, et tu ne teste qu'une
chose, sans relire ton code en te demandant à quoi sert cette chose...







$time=1/5; // une seconde pour un cinq ko



$fp = fopen("$dossier/$fichier", 'rb');

set_time_limit(0);

while (!feof($fp)){

$f=fgets($fp, 1024);

list($usec, $lastsec) = explode(' ',microtime());

$sec=$sec+$usec;

//dans cette boucle, on ne doit rien afficher !!!

//elle ne fait que ralentir

for (;$sec<$last_sec+$time;) {

list($usec, $sec) = explode(' ',microtime());

$sec=$sec+$usec;

}

echo $f;

}

fclose ($fp);

In a dream, I saw me, drop dead... U was here, U cried... It was just a deam, if I die, U won't cry, maybe, U'll be happy

http://coucou747.hopto.org
Messages postés
470
Date d'inscription
vendredi 14 novembre 2003
Statut
Membre
Dernière intervention
23 octobre 2007
1
après avoir regardé attentivement le code, il semblerait que cela vienne d'autre chose, lorsqu'il y a un temps d'attente le téléchargement à des risques de ce bloquer.

as tu une idée sur le problème de la déconnexion ?

Merci

filipe
Messages postés
9433
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
8
combien de temps dure ton téléchargement avant de bloquer ?

<hr size="2" width="100%"><li>Entraide, dépannage et vulgarisation informatique : Mon site de vulgarisation informatique</li>
Messages postés
470
Date d'inscription
vendredi 14 novembre 2003
Statut
Membre
Dernière intervention
23 octobre 2007
1
c'est variable, des fois 10sec des fois plus d'une minute.....