web-dev-qa-db-fra.com

Le temps de sommeil compte-t-il pour la limite de temps d'exécution?

J'ai deux questions concernant la fonction sleep() en PHP:

  1. Le temps de veille affecte-t-il la limite de temps d'exécution maximum de mes PHP scripts? Parfois, PHP affiche le message "temps d'exécution maximum de 30 secondes dépassé"). ce message apparaît si j'utilise sleep(31)?

  2. Y a-t-il des risques lors de l'utilisation de la fonction sleep()? Cela coûte-t-il beaucoup de performances du processeur?

50
caw

Vous devriez l'essayer, ayez juste un script qui dort plus que votre temps d'exécution maximum.

<?php
  sleep(ini_get('max_execution_time') + 10);
?>

Spoiler: Sous Linux, le temps de sommeil est ignoré, mais sous Windows, il compte comme temps d'exécution.

86
Samuel

Cela n'affecte que le temps du script et non les appels système comme sleep (). Il y a apparemment un bug où sur Windows sleep () est inclus. Le temps d'exécution maximum concerne le temps réel, pas le temps CPU ou quelque chose comme ça. Vous pouvez toutefois le modifier:

  • max_execution_time directive dans votre php.ini. Il s'agit d'un cadre global;
  • Utilisation de ini_set () avec la directive ci-dessus. Cela le changera uniquement pour le script en cours d'exécution uniquement pour cette exécution;
  • set_time_limit () : également un changement local.

Quant à la différence entre les deux derniers, je crois que max_execution_time est une quantité fixe. Fonctionnement:

ini_set('max_execution_time', 60);

limitera le script à 60 secondes. Si après 20 secondes vous appelez:

set_time_limit(60);

le script sera désormais limité à 20 + 60 = 80 secondes.

8
cletus

Depuis la page PHP sleep () , il y a cette note fournie par l'utilisateur:

Remarque: La fonction set_time_limit () et la directive de configuration max_execution_time n'affectent que le temps d'exécution du script lui-même. Tout temps passé sur une activité qui se produit en dehors de l'exécution du script, comme les appels système utilisant system (), la fonction sleep (), les requêtes de base de données, etc. n'est pas inclus lors de la détermination de la durée maximale d'exécution du script.

7
karim79

D'autres ont déjà couvert les bases de sleep () et PHP délai d'exécution du script, mais vous devez également être conscient d'un autre risque lors de l'utilisation de très longues périodes de sommeil.

Habituellement, lorsqu'un navigateur envoie une demande à un serveur et ne reçoit aucune donnée du serveur, la connexion peut expirer. Cette limite de temps dépend des configurations du navigateur, mais j'ai lu qu'IE7 a une valeur par défaut de seulement 30 secondes, tandis que Firefox a une valeur par défaut de 115 secondes - vous pouvez vérifier votre propre configuration dans Firefox en accédant à about: config et filtrage pour network.http.keep-alive.timeout (le délai est spécifié en secondes).

Edit: J'ai eu les unités pour network.http.keep-alive.timeout et browser.urlbar.search.timeout mélangées. C'est en effet en quelques secondes, pas en dixièmes de seconde.

0
Calvin