Mesurer le temps d'exécution du script PHP qui sert de contenu web
Je suis en essais, le temps d'exécution de certains scripts PHP dont le but est de servir du contenu web sur mon site web.
Cependant j'obtiens des résultats incohérents.
Le temps d'exécution est mesuré et enregistré dans un fichier texte.
Un des scripts de coeur de lecture d'une image jpeg à partir du disque et sert au client.
Ici est une version simplifiée du script avec le code:
<?php
//save initial time
$t1 = microtime(true);
//set header for a jpeg image
header('Content-Type: image/jpeg');
//read a file from the hard drive and send content
//(the real code serves every time a different image based on the request)
readfile( 'the_image.jpg' );
//flush output buffer
flush();
ob_flush();
//save final time
$t2 = microtime(true);
//elapsed time in milliseconds
$te = round( ( $t2 - $t1 ) * 1000 );
//write a line to the log file
$handle = fopen( 'log.txt', 'a' );
fwrite( $handle, $te . "\n" );
fclose( $handle );
Images servis sont à chaque fois différents. Ils sont autour de 100 ko de taille.
Je me connecte au site web à partir d'un emplacement distant et le chargement de certaines images.
Quand je regarde le fichier journal temps d'exécution en millisecondes ressemble à ceci
45
63
40
3
3
67
40
3
5
Je m'attends (mais sans doute que je me trompe sur ce) que lorsque le script PHP envoie des données au client d'exécution attend jusqu'à ce que les données ont été envoyées.
Donc, dans le code ci-dessus, $t2
est récupérée lorsque l'image a été complètement envoyée au client.
Alors pourquoi, parfois, l'image prend juste 3 ms à être envoyé?
3 ms est impossible à réaliser compte tenu de la connexion internet, je suis en utilisant lorsqu'il est connecté au serveur.
Est PHP envoi de toutes les données instantanément vers le serveur web (c'est nginx dans mon cas) et puis ce dernier prend son temps pour envoyer les données au client?
Mise à jour
Il semble que le problème est lié à nginx faire tampon.
Lorsque cela arrive nginx "mange" la mémoire tampon de sortie de PHP aussi vite que possible, puis envoie le contenu au client.
Cela permet à l'PHP instance d'être fermé plus tôt.
Le script PHP ne voit pas le temps nécessaire pour transférer le contenu vers le client.
Malheureusement, il semble y avoir aucun moyen de désactiver nginx de mise en mémoire tampon. J'ai trouvé beaucoup de "recettes" googler autour, mais personne ne travaille.
OriginalL'auteur Paolo | 2014-09-01
Vous devez vous connecter pour publier un commentaire.
Vous pouvez essayer d'exécuter le script à partir de la ligne de commande pour voir si la connexion lag est un facteur. Je pense que non mais-c'est probablement lié à la charge sur le serveur. Si le disque ou le CPU est occupé ailleurs au moment de la demande, il aura une influence sur le temps d'exécution de votre script.
OriginalL'auteur Ryan
Court et simple: flush(); ne marche pas attendre le client.
C'est seulement le temps qui PHP nécessaire et non pas le réseau.
OriginalL'auteur A. Blub
Vous ne pouvez voir combien de temps PHP pour charger votre fichier.
Si vous voulez voir combien de temps votre client a besoin de le charger, alors vous devez utiliser JS.
Et n'oubliez pas, que votre navigateur ont un système de mise en cache. Vous pouvez le désactiver avec des en-Têtes ou des URL différentes
OriginalL'auteur A. Blub