1

Bon, j'avais d'abord pensé envoyer ce message uniquement à squale, mais en fait je me dis que vous avez peut-être un avis sur le sujet...

J'ai une question sur le fonctionnement de max_execution_time (à laquelle je ne trouve pas de réponse exacte, sauf quelques pistes ici : http://www.binarytides.com/php-set-time-limit/ )
J'utilise des scripts PHP pour réaliser des opérations assez lourdes (synchronisations, ETL...) qui peuvent durer très longtemps (parfois plusieurs dizaines de minutes, voire plusieurs heures).

Mon php.ini indique un max_execution_time à 30 secondes. Dans la pratique, l'exécution du script (en CLI ou via un navigateur) dure beaucoup plus que ça (une quarantaine de minutes) sans qu'il n'y ait de message d'erreur.
Il se trouve que j'ai eu à ajouter des contrôles complémentaires en début de script (ça me le rallonge d'au moins une dizaine de minutes). Et paf, je me trouve en erreur pour cause de dépassement du max_execution_time.

Je vais donc changer mon paramétrage, mais j'aimerais savoir pourquoi :
- ça ne partait pas en erreur avant alors que j'avais un script qui dépassait déjà largement les 30s (même en retirant les requêtes SQL et LDAP, les traitements cumulés durent plus de 30s)
- à présent, ça coupe bien avant la durée d'exécution précédente (ça doit couper au bout de 20 minutes, alors que j'étais à une 40aine).

Est-ce que quelqu'un sait comment est calculé le temps d'exécution ? Sur le fichier de script en cours ? Sur la fonction en cours ? Sur l'intégralité de l'exécution depuis le premier appel ?

J'aimerais savoir si quelqu'un connaissait une technique permettant d'interrompre proprement l'exécution d'un script depuis un autre script (par exemple d'avoir une page web permettant de monitorer et d'interrompre l'exécution de mon long script), sans passer par un fichier de verrouillage et un kill système.
avatar

2

En temps CPU, mais ton truc passe la majorité de son temps en iowait le temps que les différentes bases répondent?

lance top dans une fenêtre a coté.

3

En effet, le temps passé en attente d'IO n'est pas compté dans le max_execution_time, cf. http://php.net/manual/fr/function.set-time-limit.php :
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é en dehors du script, comme un appel système utilisant system(), des opérations sur les flux, les requêtes sur base de données, etc. n'est pas pris en compte lors du calcul de la durée maximale d'exécution du script. Ceci est faux sous Windows où le temps mesuré est le temps réel.
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

4

Oui, j'ai vu cette partie... mais ça me paraît bizarre que la partie hors PHP dure moins de 30 secondes (ça voudrait dire que tout le reste dure plus de 40 minutes, ce qui me semble assez énorme).
Je n'ai pas trouvé de fonction permettant de ne retourner que le temps pris en compte...
avatar

5

6

Hm, je vais regarder pour voir si ça me permet d'approfondir le problème (là, j'ai des connexions avec des serveurs qui tombent en timeout alors que ça ne me le faisait jamais... c'est vraiment très étrange...)

edit : ah non, c'est normal, pour le coup
avatar

7

Nil (./1) :
J'aimerais savoir si quelqu'un connaissait une technique permettant d'interrompre proprement l'exécution d'un script depuis un autre script (par exemple d'avoir une page web permettant de monitorer et d'interrompre l'exécution de mon long script), sans passer par un fichier de verrouillage et un kill système.

Au boulot pour gérer de gros efforts on a un système avec un cron qui toutes les 5 minutes vérifie si il y a un export à faire, et le fait (exécute une commande symphony, ça doit correspondre à un exec?) si jamais il n'y a pas déjà une commande en cours (on sait ça grâce à un exec("ps...") ) Si le temps max est dépassé, on kill le processus et on lance l'export suivant.
avatar
loclamor
Mondo Photo
Le voyage en photo et en 1 clic

8

Hm, c'est un peu bourrin ; au pire c'est ce que je ferai...
avatar

9

Nil (./8) :
c'est un peu bourrin
On ne fait pas du PHP parce qu'on aime la finesse embarrassed
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

10

Non, j'en fais parce que je suis un gros crado #bav#
avatar

11

J'avais ce soucis en cli d'un script qui ne s'arrêtait pas mais c'est parce que "This directive is hardcoded to 0 for the CLI SAPI" (du coup j'ai limité la valeur maximum pour la mémoire utilisée).