2011-10-18 1 views
0

J'ai un script de téléchargement qui vérifie un certain nombre de choses et diffuse ensuite un fichier en morceaux de 8 ko.Le délai d'expiration du script PHP se produira-t-il lors d'une instruction print/flush?

La boucle qui fait le transfert ressemble:


$file = @fopen($file_path,"rb"); 
if ($file) { 
    while(!feof($file)) { 
    set_time_limit(60); 
    print(fread($file, 1024*8)); 
    flush(); 
    if (connection_status()!=0) { 
     @fclose($file); 
     die(); 
    } 
    } 
    @fclose($file); 
} 

j'ai écrit une petite application qui simule un téléchargement très lent. Il attend 2 minutes avant de poursuivre le téléchargement. Je m'attendais à ce que le script expire étant donné que j'ai fixé une limite de temps de 60 secondes. Cela n'arrive pas et le téléchargement continue jusqu'à ce qu'il soit terminé. Il semble que le temps passé dans print/flush ne compte pas dans le temps d'exécution du script. Est-ce correct? Existe-t-il un meilleur moyen d'envoyer le fichier au client/navigateur de sorte que je puisse spécifier une limite de temps pour la commande print/flush?

Répondre

1

De set_time_limit():

The set_time_limit() function and the configuration directive max_execution_time 
only affect the execution time of the script itself. Any time spent on activity 
that happens outside the execution of the script such as system calls using system(), 
stream operations, database queries, etc. is not included when determining the 
maximum time that the script has been running. This is not true on Windows where 
the measured time is real. 

Il semble donc que vous pouvez mesurer le passage du temps réel avec des appels à la fonction time(), le long des lignes de:

$start = time(); 
while (something) { 
    // do something 
    if(time()-$start > 60) die(); 
} 

Ou vous pouvez utiliser Les fenêtres. Je préfère la première option: p

+0

Bien, mais cela ne m'aide pas dans le cas de l'instruction flush qui bloque l'exécution du script. Si elle ne revient jamais, je ne serai pas en mesure de faire le temps de vérifier ... – Christo

+0

Juste pour le bien de l'intérêt. J'ai exécuté le test sur Windows avec IIS, qui n'est pas mort sur moi non plus (il l'a fait après un long moment, mais je m'attends à ce que IIS soit le coupable et non la limite de temps d'exécution de PHP). Le serveur de production exécute Linux & Apache. – Christo

Questions connexes