Bonjour à tous.
Ce post pour demander de l'aide à propos d'un comportement étrange qui peut être reproduit tout le temps (apcahe2 + php5).
Je ne sait pas si je me plante mais je vais essayer d'expliquer la finalité de la démarche:
J'ai besoin d'envoyer des chunks de donnée binaires (par exemple 30), puis de calculer la bande passante moyenne sur ces 30 shunts en Kbit/s.
J'additionne chaque temps d'output dans une var, ainsi que la taille de chaque chunk, puis je fait le total à la fin.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 <?php // build my binary chunk $var= ''; $o=9000; while($o--) { $var.= "testtest"; } // get the size, prepare the memory. $size = strlen($var); $tt_sent = 0; $tt_time = 0; // I send my chunk 30 times for ($i = 0; $i < 30; $i++) { // start time $t = microtime(true); echo $var."\n"; ob_flush(); flush(); $e = microtime(true); // end time // the difference should reprenent what it takes to the server to // transmit chunk to client right ? // add this chuck bench to the total $tt_time += round($e-$t,4); $tt_sent += $size; } // total result echo "\n total: ".(($tt_sent*8)/($tt_time)/1024)."\n"; ?>
Dans l'exemple du dessus, ça semble marcher, mes résultats sont cohérents lorsque je limite ma bande passante sur le port 80.
Maintenant, supposons que j'ai besoin de limiter l'envoi de ces chunks ( car le client à assez de data à traiter avec un shunts sur une seconde ).
J'utilise usleep(1000000), ainsi, après l'envoit d'un chunk puis l'estimation du temps que cela à pris, je fait une petite pause.
Dans l'exemple ci-dessus, mon calcul final est tout bonnement incohérent, j'ai des saut de 70000Kbit/s, à + d'un millions, car l'estimation du temps d'output est complètement falsifiée : (le temps calculé (microtime(true)) d'envoi de chaque chunk devient ridiculement court, même avec des données binaires plus importantes).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 <?php // build my binary chunk $var= ''; $o=9000; while($o--) { $var.= "testtest"; } // get the size, prepare the memory. $size = strlen($var); $tt_sent = 0; $tt_time = 0; // I send my chunk 30 times for ($i = 0; $i < 30; $i++) { // start time $t = microtime(true); echo $var."\n"; ob_flush(); flush(); $e = microtime(true); // end time // the difference should reprenent what it takes to the server to // transmit chunk to client right ? // add this chuck bench to the total $tt_time += round($e-$t,4); $tt_sent += $size; usleep(1000000); // the usleep } // total result echo "\n total: ".(($tt_sent*8)/($tt_time)/1024)."\n"; ?>
J'ai besoin d'aide pour comprendre ce qu'il va pas dans cet exemple, ou si c'est un comportement normal (ob_flush();/flush(); asynchrones …)
Config: LAMP php 5.3
Merci !
Partager